/ Hex Artifact Content
Login

Artifact fac516ae6a04a45b2e84804245d0d0c38be07e8dd62be1f7613c83913f681570:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7150: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7160: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7170: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7180: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7190: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
71a0: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71b0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71c0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71d0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7200: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7210: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7220: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7230: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7240: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7250: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7260: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7270: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
72a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72b0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72c0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72d0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72e0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72f0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
7300: 65 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72  ess */.  u8 extr
7310: 61 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  aSync;          
7320: 20 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72       /* sync dir
7330: 65 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75  ectory after jou
7340: 72 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20  rnal delete */. 
7350: 20 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67   u8 ckptSyncFlag
7360: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
7370: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
7380: 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65  YNC_FULL for che
7390: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  ckpoint */.  u8 
73a0: 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  walSyncFlags;   
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43           /* SYNC
73c0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
73d0: 46 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69  FULL for wal wri
73e0: 74 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  tes */.  u8 sync
73f0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7400: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7410: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7420: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
7430: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
7440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
7450: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
7460: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74  mporary or immut
7470: 61 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  able file */.  u
7480: 38 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  8 noLock;       
7490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
74a0: 20 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70   not lock (excep
74b0: 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a  t in WAL mode) *
74c0: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
74f0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
7500: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
7530: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
7540: 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a  O */..  /*******
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7590: 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ***.  ** The fol
75a0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
75b0: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
75c0: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63  s members that c
75d0: 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a  hange during.  *
75e0: 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74  * routine operat
75f0: 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62  ion.  Class memb
7600: 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20  ers not in this 
7610: 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72  block are either
7620: 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e   fixed.  ** when
7630: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69   the pager is fi
7640: 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65  rst created or e
7650: 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20  lse only change 
7660: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a  when there is a.
7670: 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74    ** significant
7680: 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75   mode change (su
7690: 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74  ch as changing t
76a0: 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f  he page_size, lo
76b0: 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a  cking_mode,.  **
76c0: 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f   or the journal_
76d0: 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f  mode).  From ano
76e0: 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65  ther view, these
76f0: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64   class members d
7700: 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65  escribe.  ** the
7710: 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20   "state" of the 
7720: 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68  pager, while oth
7730: 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  er class members
7740: 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20   describe the.  
7750: 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f  ** "configuratio
7760: 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  n" of the pager.
7770: 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74  .  */.  u8 eStat
7780: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7790: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61      /* Pager sta
77a0: 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52  te (OPEN, READER
77b0: 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e  , WRITER_LOCKED.
77c0: 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b  .) */.  u8 eLock
77d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
77e0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
77f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61  ock held on data
7800: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
7810: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
7820: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
7830: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
7840: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
7850: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
7860: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
7870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7880: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
7890: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
78a0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
78b0: 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20  doNotSpill;     
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
78d0: 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  ot spill the cac
78e0: 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f  he when non-zero
78f0: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7900: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7910: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7920: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7930: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20  ournals */.  u8 
7940: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7960: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7970: 20 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64   */.  u8 hasHeld
7980: 53 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20  SharedLock;     
7990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73    /* True if a s
79a0: 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65  hared lock has e
79b0: 76 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f  ver been held */
79c0: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
79f0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7a00: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7a10: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
7a20: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
7a30: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
7a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
7a50: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
7a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7a70: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7a80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7a90: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7aa0: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7ab0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7ac0: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7ad0: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7ae0: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b00: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7b10: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7b50: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
7b60: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
7b70: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7b80: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7b90: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7ba0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7bb0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7bc0: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7be0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7bf0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7c00: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7c10: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7c20: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7c30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7c40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7c50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7c60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7c70: 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20  MIT_CONCURRENT. 
7c80: 20 42 69 74 76 65 63 20 2a 70 41 6c 6c 52 65 61   Bitvec *pAllRea
7c90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7ca0: 50 61 67 65 73 20 72 65 61 64 20 77 69 74 68 69  Pages read withi
7cb0: 6e 20 63 75 72 72 65 6e 74 20 43 4f 4e 43 55 52  n current CONCUR
7cc0: 52 45 4e 54 20 74 72 61 6e 73 2e 20 2a 2f 0a 23  RENT trans. */.#
7cd0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
7ce0: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7cf0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7d00: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7d10: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7d20: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7d30: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7d40: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7d50: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7d60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7d70: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7d80: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d90: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7da0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7dc0: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7dd0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7de0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7df0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7e10: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7e20: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7e30: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7e40: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7e50: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7e60: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7e70: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7e80: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e90: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7ea0: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7eb0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7ec0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7ed0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ef0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7f00: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7f10: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7f20: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7f30: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7f40: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7f50: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7f60: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7f70: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7f80: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f90: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7fa0: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7fb0: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7fc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7fd0: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7fe0: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7ff0: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
8000: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
8010: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
8020: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
8030: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
8040: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
8050: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
8060: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
8070: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
8080: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8090: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
80a0: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
80b0: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
80f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8100: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8110: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8120: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
8130: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
8140: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
8150: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
8160: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
8170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8180: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8190: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
81a0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
81b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
81c0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
81d0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
81e0: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
81f0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8200: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8210: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8220: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
8230: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8250: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8260: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
8270: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
8280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8290: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
82a0: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
82b0: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
82c0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
82d0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
82e0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
82f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8300: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8310: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8320: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
8330: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
8340: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8360: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
8370: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
8380: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8390: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
83a0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
83b0: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
83c0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
83d0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
83e0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
83f0: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8400: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8420: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
8430: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
8440: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
8450: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
8460: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
8470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
8480: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8490: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
84a0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
84b0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
84c0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
84d0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
84e0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
84f0: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8500: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8510: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8520: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
8530: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
8540: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
8550: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
8560: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
8570: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
8580: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8590: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
85a0: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
85b0: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
85c0: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
85d0: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
85e0: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
85f0: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8600: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8610: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8620: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
8630: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
8640: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
8650: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
8660: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
8670: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
8680: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8690: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
86a0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
86b0: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
86c0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
86d0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
86e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
86f0: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8700: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8710: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8720: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
8730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
8740: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
8750: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
8760: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
8770: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
8780: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8790: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
87a0: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
87b0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dif.};../*.** In
87c0: 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69  dexes for use wi
87d0: 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  th Pager.aStat[]
87e0: 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61  . The Pager.aSta
87f0: 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  t[] array contai
8800: 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  ns.** the values
8810: 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73   accessed by pas
8820: 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54  sing SQLITE_DBST
8830: 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
8840: 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f  CACHE_MISS .** o
8850: 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f  r CACHE_WRITE to
8860: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
8870: 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  us()..*/.#define
8880: 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20   PAGER_STAT_HIT 
8890: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
88a0: 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23  R_STAT_MISS  1.#
88b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
88c0: 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a  T_WRITE 2../*.**
88d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
88e0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
88f0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8900: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8910: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
8920: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
8930: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
8940: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
8950: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
8960: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
8970: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
8980: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8990: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
89a0: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
89b0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
89c0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
89d0: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
89e0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
89f0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8a00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8a10: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
8a20: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
8a30: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8a40: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
8a50: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
8a60: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
8a70: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
8a80: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8a90: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8aa0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8ab0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8ac0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8ad0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8ae0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8af0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8b00: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8b10: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
8b20: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
8b30: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
8b40: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
8b50: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
8b60: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
8b70: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8b80: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8b90: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8ba0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8bb0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8bc0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8bd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8be0: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8bf0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8c00: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8c10: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
8c20: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
8c30: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
8c40: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
8c50: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
8c60: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
8c70: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8c80: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8c90: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8ca0: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8cb0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8cc0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8cd0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8ce0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8cf0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8d00: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8d10: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
8d20: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8d30: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
8d40: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8d50: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
8d60: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
8d70: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8d80: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8d90: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8da0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8db0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8dc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8dd0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8de0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8df0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8e00: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8e10: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
8e20: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
8e30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
8e40: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
8e50: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
8e60: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
8e70: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8e80: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8e90: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8ea0: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8eb0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8ec0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8ed0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8ee0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8ef0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8f00: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8f10: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
8f20: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
8f30: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
8f40: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
8f50: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
8f60: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
8f70: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8f80: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8f90: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8fa0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8fb0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8fc0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8fd0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8fe0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8ff0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
9000: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
9010: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
9020: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
9030: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
9040: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
9050: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
9060: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
9070: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
9080: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
9090: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
90a0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
90b0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
90c0: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
90d0: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
90e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
90f0: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
9100: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
9110: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
9120: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
9130: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
9140: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
9150: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
9160: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
9170: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
9180: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
9190: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
91a0: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
91b0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
91c0: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
91d0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
91e0: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
91f0: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
9200: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
9210: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
9220: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
9230: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
9240: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
9250: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
9260: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
9270: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
9280: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
9290: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
92a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
92b0: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
92c0: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
92d0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
92e0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
92f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
9300: 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69  macro USEFETCH i
9310: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
9320: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20   allowed to use 
9330: 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78  the xFetch and x
9340: 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72  Unfetch.** inter
9350: 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20  faces to access 
9360: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
9370: 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  ng memory-mapped
9380: 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   I/O..*/.#if SQL
9390: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
93a0: 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45  E>0.# define USE
93b0: 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62  FETCH(x) ((x)->b
93c0: 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a  UseFetch).#else.
93d0: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
93e0: 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  H(x) 0.#endif../
93f0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
9400: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
9410: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
9420: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
9430: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
9440: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68  483647../*.** Th
9450: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
9460: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
9470: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
9480: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
9490: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
94a0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
94b0: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
94c0: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
94d0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
94e0: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
94f0: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
9500: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
9510: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
9520: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
9530: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
9540: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
9550: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
9560: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
9570: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
9580: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
9590: 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  ds!=0)../*.** Re
95a0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
95b0: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
95c0: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 74  rite-ahead log t
95d0: 6f 20 72 65 61 64 20 70 61 67 65 20 70 67 6e 6f  o read page pgno
95e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
95f0: 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  e if the pager r
9600: 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65 63 74  eads pgno direct
9610: 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
9620: 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  base..*/.#if !de
9630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9640: 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69 6e 65  T_WAL) && define
9650: 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  d(SQLITE_DIRECT_
9660: 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29 0a 69  OVERFLOW_READ).i
9670: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
9680: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9690: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
96a0: 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d 20 30  .  u32 iRead = 0
96b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
96c0: 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
96d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
96e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
96f0: 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
9700: 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 52  >pWal, pgno, &iR
9710: 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ead);.  return r
9720: 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a 23 65  c || iRead;.}.#e
9730: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
9740: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20 64  ITE_OMIT_WAL.# d
9750: 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61  efine pagerUseWa
9760: 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c 21  l(x) ((x)->pWal!
9770: 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  =0).#else.# defi
9780: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9790: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
97a0: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
97b0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
97c0: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
97d0: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
97e0: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
97f0: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
9800: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
9810: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
9820: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
9830: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
9840: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
9850: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9860: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9870: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9880: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9890: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
98a0: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
98b0: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
98c0: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
98d0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
98e0: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
98f0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
9900: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
9910: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
9920: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
9930: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
9940: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
9950: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9960: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9970: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9980: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9990: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
99a0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
99b0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
99c0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
99d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
99e0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
99f0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9a00: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
9a10: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
9a20: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9a30: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
9a40: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a50: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9a60: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9a70: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9a80: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9a90: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9aa0: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9ab0: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9ac0: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9ad0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9ae0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9af0: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
9b00: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
9b10: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
9b20: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9b30: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9b40: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9b50: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9b60: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9b70: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9b80: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9b90: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9ba0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9bb0: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9bc0: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9bd0: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9be0: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9bf0: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
9c00: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
9c10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9c20: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9c40: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9c50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9c60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c80: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9c90: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9ca0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9cb0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9cc0: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9cd0: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9ce0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9cf0: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9d00: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9d10: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9d20: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9d30: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9d40: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9d50: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9d60: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9d70: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9d80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9d90: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9da0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9db0: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9dc0: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9dd0: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9de0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9df0: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9e00: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9e10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9e20: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9e30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9e40: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9e50: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9e60: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9e70: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9e80: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9e90: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9ea0: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9eb0: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
9ed0: 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20  Open(p->fd) );. 
9ee0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9ef0: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9f00: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9f10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9f20: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9f30: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9f40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9f50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9f60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9f70: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9f80: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9f90: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9fa0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9fb0: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9fc0: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9fd0: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9fe0: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9ff0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
a000: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
a010: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
a020: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
a030: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
a040: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
a050: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
a060: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
a070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
a080: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
a090: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
a0a0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
a0b0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
a0c0: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
a0d0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
a0e0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a0f0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a100: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a110: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a120: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a130: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
a140: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
a150: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
a160: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a170: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
a180: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a190: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a1a0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a1b0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a1c0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a1d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a1e0: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
a1f0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a200: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a210: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a220: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a230: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a240: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a250: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a260: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a270: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a280: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a290: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a2a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a2b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a2c0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  K );.      }.#if
a2d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a2e0: 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20 20  _CONCURRENT.    
a2f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a300: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
a310: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 7c 7c 20  ->dbOrigSize || 
a320: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
a330: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   );.#endif.     
a340: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a350: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a360: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a370: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a380: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a390: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a3a0: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a3b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a3c0: 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
a3d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3e0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3f0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20  ITER_CACHEMOD:. 
a400: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a410: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
a420: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a430: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a440: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a450: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
a460: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a470: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
a480: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
a490: 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  hat if journal_m
a4a0: 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61  ode=wal here tha
a4b0: 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20  t neither the.  
a4c0: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
a4d0: 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41   file nor the WA
a4e0: 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e  L file are open.
a4f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75   This happens du
a500: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
a510: 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  a rollback trans
a520: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74  action that swit
a530: 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ches from journa
a540: 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20  l_mode=off.     
a550: 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c     ** to journal
a560: 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20  _mode=wal..     
a570: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
a580: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a590: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
a5a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a5b0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a5d0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a5e0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a5f0: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a600: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a610: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a620: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a630: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
a640: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
a650: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a660: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a670: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a680: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a690: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a6a0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a6b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a6c0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a6d0: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20  RITER_DBMOD:.   
a6e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a6f0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a700: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a710: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a720: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a730: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a740: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a750: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a760: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a770: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a780: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a790: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a7b0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a7c0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a7d0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a7e0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a7f0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a800: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a810: 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
a820: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
a830: 65 72 69 73 74 69 63 73 28 70 2d 3e 66 64 29 26  eristics(p->fd)&
a840: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
a850: 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 20 20 20  CH_ATOMIC).     
a860: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a870: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a880: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
a890: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a8a0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a8b0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a8c0: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
a8d0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a8e0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a8f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a900: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a910: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a920: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a930: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a940: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a950: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a960: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a970: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a980: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a990: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a9a0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a9b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9c0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a9d0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71 6c           || (sql
a9e0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
a9f0: 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 66  acteristics(p->f
aa00: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
aa10: 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20  BATCH_ATOMIC).  
aa20: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65      );.      bre
aa30: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
aa40: 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  GER_ERROR:.     
aa50: 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62   /* There must b
aa60: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
aa70: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
aa80: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
aa90: 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  r if.      ** in
aaa0: 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
aab0: 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65  herwise the page
aac0: 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  r should have al
aad0: 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20  ready dropped.  
aae0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f      ** back to O
aaf0: 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20  PEN state..     
ab00: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
ab10: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
ab20: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
ab30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
ab40: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
ab50: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
ab60: 63 68 65 29 3e 30 20 7c 7c 20 70 50 61 67 65 72  che)>0 || pPager
ab70: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
ab80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
ab90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
aba0: 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 4e  ndif /* ifndef N
abb0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
abc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a 2f   SQLITE_DEBUG ./
abd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
abe0: 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61 6e  inter to a human
abf0: 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e 67   readable string
ac00: 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75 66   in a static buf
ac10: 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e  fer.** containin
ac20: 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  g the state of t
ac30: 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
ac40: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
ac50: 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20 69  ument. This.** i
ac60: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
ac70: 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65 62   used within deb
ac80: 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61 6d  uggers. For exam
ac90: 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65 72  ple, as an alter
aca0: 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70 72  native.** to "pr
acb0: 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e 20  int *pPager" in 
acc0: 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29  gdb:.**.** (gdb)
acd0: 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70 72   printf "%s", pr
ace0: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
acf0: 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74 69  pPager).*/.stati
ad00: 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70 61  c char *print_pa
ad10: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
ad20: 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  *p){.  static ch
ad30: 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a  ar zRet[1024];..
ad40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ad50: 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20  tf(1024, zRet,. 
ad60: 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20       "Filename: 
ad70: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
ad80: 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20 20   "State:        
ad90: 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e   %s errCode=%d\n
ada0: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20  ".      "Lock:  
adb0: 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20          %s\n".  
adc0: 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64      "Locking mod
add0: 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  e:  locking_mode
ade0: 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%s\n".      "Jo
adf0: 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75  urnal mode:  jou
ae00: 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  rnal_mode=%s\n".
ae10: 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20 73        "Backing s
ae20: 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25  tore: tempFile=%
ae30: 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f  d memDb=%d useJo
ae40: 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20  urnal=%d\n".    
ae50: 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20    "Journal:     
ae60: 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c    journalOff=%ll
ae70: 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c  d journalHdr=%ll
ae80: 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a 65  d\n".      "Size
ae90: 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69 7a  :          dbsiz
aea0: 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65 3d  e=%d dbOrigSize=
aeb0: 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25 64  %d dbFileSize=%d
aec0: 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a  \n".      , p->z
aed0: 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c  Filename.      ,
aee0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
aef0: 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  R_OPEN          
af00: 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20    ? "OPEN" :.   
af10: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
af20: 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20 20  PAGER_READER    
af30: 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52 22        ? "READER"
af40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
af50: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
af60: 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57  ER_LOCKED   ? "W
af70: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a  RITER_LOCKED" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
af90: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
afa0: 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49 54  CACHEMOD ? "WRIT
afb0: 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20  ER_CACHEMOD" :. 
afc0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
afd0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
afe0: 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54 45  BMOD    ? "WRITE
aff0: 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20  R_DBMOD" :.     
b000: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b010: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
b020: 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46 49  HED ? "WRITER_FI
b030: 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20 20  NISHED" :.      
b040: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
b050: 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20  ER_ERROR        
b060: 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20 22     ? "ERROR" : "
b070: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
b080: 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65   (int)p->errCode
b090: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63  .      , p->eLoc
b0a0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20  k==NO_LOCK      
b0b0: 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a     ? "NO_LOCK" :
b0c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
b0d0: 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
b0e0: 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22 20     ? "RESERVED" 
b0f0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b100: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
b110: 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56 45  CK  ? "EXCLUSIVE
b120: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b130: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
b140: 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44 22  K     ? "SHARED"
b150: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
b160: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
b170: 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22  K    ? "UNKNOWN"
b180: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
b190: 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76     , p->exclusiv
b1a0: 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73 69  eMode ? "exclusi
b1b0: 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20  ve" : "normal". 
b1c0: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
b1d0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b1e0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
b1f0: 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20    ? "memory" :. 
b200: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b210: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b220: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
b230: 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20 20    ? "off" :.    
b240: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b250: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b260: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 3f  LMODE_DELETE   ?
b270: 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20 20   "delete" :.    
b280: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b290: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b2a0: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 3f  LMODE_PERSIST  ?
b2b0: 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20 20   "persist" :.   
b2c0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b2d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b2e0: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
b2f0: 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a 20  ? "truncate" :. 
b300: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
b310: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
b320: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
b330: 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65 72    ? "wal" : "?er
b340: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b350: 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20  nt)p->tempFile, 
b360: 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28  (int)p->memDb, (
b370: 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61  int)p->useJourna
b380: 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75  l.      , p->jou
b390: 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72  rnalOff, p->jour
b3a0: 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20 28  nalHdr.      , (
b3b0: 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28  int)p->dbSize, (
b3c0: 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a  int)p->dbOrigSiz
b3d0: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c  e, (int)p->dbFil
b3e0: 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65  eSize.  );..  re
b3f0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e  turn zRet;.}.#en
b400: 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  dif../* Forward 
b410: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
b420: 65 20 76 61 72 69 6f 75 73 20 70 61 67 65 20 67  e various page g
b430: 65 74 74 65 72 73 20 2a 2f 0a 73 74 61 74 69 63  etters */.static
b440: 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d   int getPageNorm
b450: 61 6c 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  al(Pager*,Pgno,D
b460: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74  bPage**,int);.st
b470: 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
b480: 45 72 72 6f 72 28 50 61 67 65 72 2a 2c 50 67 6e  Error(Pager*,Pgn
b490: 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b  o,DbPage**,int);
b4a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b4b0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
b4c0: 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
b4d0: 61 70 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  ap(Pager*,Pgno,D
b4e0: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65  bPage**,int);.#e
b4f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
b500: 74 68 65 20 50 61 67 65 72 2e 78 47 65 74 20 6d  the Pager.xGet m
b510: 65 74 68 6f 64 20 66 6f 72 20 74 68 65 20 61 70  ethod for the ap
b520: 70 72 6f 70 72 69 61 74 65 20 72 6f 75 74 69 6e  propriate routin
b530: 65 20 75 73 65 64 20 74 6f 20 66 65 74 63 68 0a  e used to fetch.
b540: 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ** content from 
b550: 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 73 74  the pager..*/.st
b560: 61 74 69 63 20 76 6f 69 64 20 73 65 74 47 65 74  atic void setGet
b570: 74 65 72 4d 65 74 68 6f 64 28 50 61 67 65 72 20  terMethod(Pager 
b580: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
b590: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b5a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
b5b0: 47 65 74 20 3d 20 67 65 74 50 61 67 65 45 72 72  Get = getPageErr
b5c0: 6f 72 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  or;.#if SQLITE_M
b5d0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
b5e0: 20 7d 65 6c 73 65 20 69 66 28 20 55 53 45 46 45   }else if( USEFE
b5f0: 54 43 48 28 70 50 61 67 65 72 29 0a 23 69 66 64  TCH(pPager).#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
b610: 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72  DEC.   && pPager
b620: 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64  ->xCodec==0.#end
b630: 69 66 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  if.  ){.    pPag
b640: 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50 61  er->xGet = getPa
b650: 67 65 4d 4d 61 70 3b 0a 23 65 6e 64 69 66 20 2f  geMMap;.#endif /
b660: 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
b670: 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65  P_SIZE>0 */.  }e
b680: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
b690: 3e 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4e  >xGet = getPageN
b6a0: 6f 72 6d 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ormal;.  }.}../*
b6b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b6c0: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b6d0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b6e0: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b6f0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b700: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b710: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b720: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b730: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b740: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b750: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b760: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b770: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b780: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b790: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b7a0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b7b0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b7c0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b7d0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b7e0: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b7f0: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b800: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b810: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b820: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b830: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b840: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b850: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b860: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b870: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b880: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b890: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b8a0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b8b0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b8c0: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b8d0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b8e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b8f0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b900: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b910: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b920: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b930: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b940: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b950: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b960: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b970: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b980: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b990: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b9a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b9b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b9c0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b9d0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b9e0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b9f0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
ba00: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
ba10: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
ba20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
ba30: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
ba40: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
ba50: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
ba60: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
ba70: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
ba80: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
ba90: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
baa0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
bab0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
bac0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
bad0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
bae0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
baf0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
bb00: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
bb10: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
bb20: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
bb30: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
bb40: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
bb50: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
bb60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
bb70: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
bb80: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
bb90: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
bba0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
bbb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bbc0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
bbd0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
bbe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
bbf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
bc00: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
bc10: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
bc20: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
bc30: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
bc40: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
bc50: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
bc60: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
bc70: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
bc80: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
bc90: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
bca0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
bcb0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
bcc0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
bcd0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
bce0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
bcf0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
bd00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
bd10: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
bd20: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
bd30: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
bd40: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
bd50: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
bd60: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
bd70: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
bd80: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
bd90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
bda0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
bdb0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
bdc0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
bdd0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
bde0: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
bdf0: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
be00: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
be10: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
be20: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
be30: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
be40: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
be50: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
be60: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
be70: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
be80: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
be90: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
bea0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
beb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
bec0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
bed0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
bee0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bef0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bf00: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
bf10: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
bf20: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
bf30: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bf40: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
bf50: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bf60: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bf70: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bf80: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
bf90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
bfa0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
bfb0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
bfc0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
bfd0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
bfe0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
bff0: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
c000: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
c010: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
c020: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
c030: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
c040: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c050: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
c060: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
c070: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
c080: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
c090: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c0a0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
c0b0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
c0c0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
c0d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
c0e0: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
c0f0: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
c100: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
c110: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c120: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
c130: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c140: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
c150: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
c160: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
c170: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
c180: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
c190: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
c1a0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
c1b0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
c1c0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
c1d0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
c1e0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
c1f0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
c200: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
c210: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
c220: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
c230: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
c240: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
c250: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
c260: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
c270: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
c280: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
c290: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
c2a0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
c2b0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
c2c0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
c2d0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
c2e0: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
c2f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c300: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
c310: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
c320: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
c330: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
c340: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
c350: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
c360: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
c370: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
c380: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
c390: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
c3a0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
c3b0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
c3c0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
c3d0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
c3e0: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
c3f0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
c400: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
c410: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
c420: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
c430: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
c440: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
c450: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
c460: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
c470: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
c480: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
c490: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
c4a0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
c4b0: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
c4c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c4d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c4e0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
c4f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
c500: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 72 0a  atomic-write or.
c510: 2a 2a 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d  ** atomic-batch-
c520: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
c530: 6f 6e 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  ons can be used 
c540: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
c550: 20 54 68 65 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77   The.** atomic-w
c560: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
c570: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
c580: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
c590: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c5a0: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
c5b0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
c5c0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
c5d0: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
c5e0: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
c5f0: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
c600: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
c610: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
c620: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
c630: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
c640: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
c650: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
c660: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 63 61 6e 20  **.** If it can 
c670: 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68  be used, then th
c680: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c690: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
c6a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
c6b0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 63 6f 6e  file when it con
c6c0: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
c6d0: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
c6e0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
c6f0: 54 68 65 20 61 74 6f 6d 69 63 2d 62 61 74 63 68  The atomic-batch
c700: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
c710: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
c720: 69 66 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  if OsDeviceChara
c730: 63 74 65 72 69 73 74 69 63 73 28 29 0a 2a 2a 20  cteristics().** 
c740: 72 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20  returns a value 
c750: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
c760: 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d  IOCAP_BATCH_ATOM
c770: 49 43 20 62 69 74 20 73 65 74 2e 20 2d 31 20 69  IC bit set. -1 i
c780: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e  s.** returned in
c790: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
c7a0: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 74  * If neither opt
c7b0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c7c0: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
c7d0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
c7e0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c7f0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c800: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c810: 4d 44 42 20 29 3b 0a 0a 23 69 66 20 64 65 66 69  MDB );..#if defi
c820: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c830: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 20  E_ATOMIC_WRITE) 
c840: 5c 0a 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  \. || defined(SQ
c850: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
c860: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a  H_ATOMIC_WRITE).
c870: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
c880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c890: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
c8a0: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
c8b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
c8c0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
c8d0: 3b 0a 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33  ;.  dc = sqlite3
c8e0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c8f0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c900: 66 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  fd);.#endif..#if
c910: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c920: 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
c930: 52 49 54 45 0a 20 20 69 66 28 20 64 63 26 53 51  RITE.  if( dc&SQ
c940: 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
c950: 5f 41 54 4f 4d 49 43 20 29 7b 0a 20 20 20 20 72  _ATOMIC ){.    r
c960: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
c970: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
c980: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
c990: 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20  C_WRITE.  {.    
c9a0: 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50  int nSector = pP
c9b0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c9c0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
c9d0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c9e0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
c9f0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
ca00: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
ca10: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
ca20: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
ca30: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
ca40: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
ca50: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
ca60: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
ca70: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
ca80: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
ca90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
caa0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
cab0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
cac0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
cad0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23  PG_SZ(pPager);.#
cae0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
caf0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  0;.}../*.** If S
cb00: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cb10: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
cb20: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
cb30: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
cb40: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
cb50: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
cb60: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
cb70: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
cb80: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cb90: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cba0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cbb0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cbc0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
cbd0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cbe0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
cbf0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
cc00: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
cc10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
cc20: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
cc30: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
cc40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
cc50: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
cc60: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
cc70: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
cc80: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
cc90: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
cca0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
ccb0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
ccc0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
ccd0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
cce0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
ccf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cd00: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cd10: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cd20: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cd30: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cd40: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cd50: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cd60: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cd70: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cd80: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
cd90: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
cda0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
cdb0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cdc0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
cdd0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cde0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
cdf0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
ce00: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
ce10: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
ce20: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
ce30: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
ce40: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
ce50: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
ce60: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
ce70: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
ce80: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
ce90: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
cea0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
ceb0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
cec0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
ced0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
cee0: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
cef0: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
cf00: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
cf10: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
cf20: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
cf30: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
cf40: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
cf50: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
cf60: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
cf70: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
cf80: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
cf90: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
cfa0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
cfb0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cfc0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
cfd0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
cfe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cff0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
d000: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
d010: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d020: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
d030: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
d040: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
d050: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
d060: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
d070: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
d080: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
d090: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
d0a0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
d0b0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
d0c0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
d0d0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d0e0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d0f0: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d100: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d110: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d120: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d130: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d140: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d150: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d160: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d170: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d180: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d190: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d1a0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d1b0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d1c0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d1d0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d1e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d1f0: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d200: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d210: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d220: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d230: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d240: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d250: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d260: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d270: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d280: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d290: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d2a0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d2b0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d2c0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d2d0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d2e0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d2f0: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d300: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d310: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d320: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d330: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d340: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d350: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d360: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d370: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d380: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d390: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d3a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d3b0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d3c0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d3d0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d3e0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d3f0: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d400: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d410: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d420: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d430: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d440: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d450: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d460: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d470: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d480: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d490: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d4a0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d4b0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d4c0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d4d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d4f0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d500: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d520: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d530: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d540: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d550: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d560: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d570: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d580: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d590: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5b0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d5c0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d5d0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d5e0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d600: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d610: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d620: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d630: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d640: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d650: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d660: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d670: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d680: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d690: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d6a0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d6b0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d6c0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d6d0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d6e0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d6f0: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d700: 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20     || len==0 .  
d710: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d720: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d730: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
d740: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
d750: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d760: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d770: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
d780: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
d790: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
d7a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
d7b0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d7c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
d7d0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
d7e0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
d7f0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
d800: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
d810: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
d820: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
d830: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d840: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
d850: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
d860: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
d870: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
d880: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
d890: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
d8a0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
d8b0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
d8c0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
d8d0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
d8e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d8f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d900: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
d910: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
d920: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
d930: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
d940: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
d950: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
d960: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
d970: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
d980: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
d990: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
d9a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
d9b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
d9c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d9e0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
d9f0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
da00: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
da10: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
da20: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
da30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
da40: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
da50: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
da60: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
da70: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
da80: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
da90: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
daa0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
dab0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
dac0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
dad0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
dae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
daf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
db00: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
db10: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
db20: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
db30: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
db40: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
db60: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
db90: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
dba0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
dbb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
dbc0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
dbd0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
dbe0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
dbf0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
dc00: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
dc10: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dc20: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
dc30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
dc40: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
dc50: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
dc60: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
dc70: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
dc80: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
dc90: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
dca0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dcb0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
dcc0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
dcd0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
dce0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
dcf0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
dd00: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
dd10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
dd20: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
dd30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
dd40: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
dd50: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
dd60: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
dd70: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
dd80: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
dd90: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
dda0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
ddb0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
ddc0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
ddd0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
dde0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
ddf0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
de00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
de10: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
de20: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
de30: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
de40: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
de50: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
de60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
de70: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
de80: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
de90: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
dea0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
deb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
dec0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
ded0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
dee0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
def0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
df00: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
df10: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
df20: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
df30: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
df40: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
df50: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
df60: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
df70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
df80: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
df90: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
dfa0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
dfb0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
dfc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
dfd0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
dfe0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
dff0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
e000: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
e010: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
e020: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
e030: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
e040: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
e050: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
e060: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
e070: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
e080: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
e090: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
e0a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
e0b0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
e0c0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e0d0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
e0e0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
e0f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e120: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
e130: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
e140: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
e150: 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69  .  assert( !sqli
e160: 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
e170: 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
e180: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
e190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
e1a0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
e1b0: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
e1c0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e1d0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
e1e0: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
e1f0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
e200: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
e210: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
e220: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
e230: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
e240: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e250: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
e260: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
e270: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
e280: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
e290: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
e2a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e2b0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
e2c0: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
e2d0: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
e2e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e2f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e300: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
e310: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e320: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
e330: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
e340: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
e350: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
e360: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e370: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
e380: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
e390: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
e3a0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
e3b0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
e3c0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
e3d0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
e3e0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
e3f0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
e400: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
e410: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
e420: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
e430: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
e440: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
e450: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
e460: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
e470: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
e480: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e490: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
e4a0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
e4b0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
e4c0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
e4d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e4e0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
e4f0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
e500: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e510: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
e520: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
e530: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e540: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
e550: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e560: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
e570: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
e580: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e590: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
e5a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
e5b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
e5c0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
e5d0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
e5e0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
e5f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
e600: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e610: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
e620: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
e630: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
e640: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
e650: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
e660: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
e670: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
e680: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
e690: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
e6a0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
e6b0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
e6c0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
e6d0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
e6e0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
e6f0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
e700: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e710: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
e720: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
e730: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e740: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
e750: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e760: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e770: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e780: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e790: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e7a0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e7b0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e7c0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e7d0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e7e0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e7f0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e800: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e810: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e820: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e830: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e840: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e860: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e870: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e880: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e890: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e8a0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e8b0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e8c0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e8d0: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e8e0: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e8f0: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e900: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e910: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e930: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e940: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e950: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e960: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e980: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e990: 2f 0a 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 6a 66 64 29  pen(pPager->jfd)
e9b0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e9c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e9d0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e9e0: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e9f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
ea00: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
ea10: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
ea20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
ea30: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
ea40: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
ea50: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
ea60: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
ea70: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
ea80: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
ea90: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
eaa0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
eab0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
eac0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
ead0: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
eae0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
eaf0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
eb00: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
eb10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
eb20: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
eb30: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
eb40: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
eb50: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
eb60: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
eb70: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
eb80: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
eb90: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
eba0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ebb0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
ebc0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
ebd0: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
ebe0: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
ebf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
ec00: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
ec10: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
ec20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
ec30: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
ec40: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
ec50: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
ec60: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
ec70: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
ec80: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
ec90: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
eca0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
ecb0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
ecc0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
ecd0: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
ece0: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
ecf0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
ed00: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
ed10: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
ed20: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
ed30: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
ed40: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
ed50: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
ed60: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
ed70: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
ed80: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
ed90: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
eda0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
edb0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
edc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
edd0: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
ede0: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
edf0: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
ee00: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
ee10: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
ee20: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
ee30: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
ee40: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
ee50: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
ee60: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
ee70: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
ee80: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
ee90: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
eea0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
eeb0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
eec0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
eed0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
eee0: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
eef0: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
ef00: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
ef10: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
ef20: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
ef30: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
ef40: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
ef50: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
ef60: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
ef70: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
ef80: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
ef90: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
efa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
efb0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
efc0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
efd0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
efe0: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
eff0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
f000: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
f010: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
f020: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
f030: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
f040: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
f050: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
f060: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
f070: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
f080: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
f090: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
f0a0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
f0b0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
f0c0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f0d0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f0e0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
f0f0: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
f100: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
f110: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
f120: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f130: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
f140: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
f150: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
f160: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
f170: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
f180: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f190: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
f1a0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
f1b0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f1c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f1d0: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
f1e0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
f1f0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
f200: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
f210: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f220: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f230: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
f240: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
f250: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
f260: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
f270: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
f280: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
f290: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f2a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
f2b0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
f2c0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
f2d0: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
f2e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f2f0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f300: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
f310: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f320: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
f330: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
f340: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
f350: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
f360: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
f370: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
f380: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
f390: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
f3a0: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
f3b0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
f3c0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
f3d0: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
f3e0: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
f3f0: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
f400: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
f410: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
f420: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
f430: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f440: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
f450: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
f460: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
f470: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
f480: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
f490: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
f4a0: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
f4b0: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
f4c0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
f4d0: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
f4e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
f4f0: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
f500: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
f510: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
f520: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
f530: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
f540: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
f550: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
f560: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
f570: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
f580: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
f590: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
f5a0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
f5b0: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
f5c0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
f5d0: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
f5e0: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
f5f0: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
f600: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
f610: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
f620: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
f630: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
f640: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
f650: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f660: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
f670: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
f680: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
f690: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
f6a0: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
f6b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
f6c0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
f6d0: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
f6e0: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
f6f0: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
f700: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
f710: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
f720: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
f730: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
f740: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
f750: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f760: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f770: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f780: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f790: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f7a0: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f7b0: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f7c0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f7d0: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f7e0: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f7f0: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f800: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f810: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f820: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f830: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f840: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f850: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f860: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f870: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f880: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f890: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f8a0: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f8b0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f8c0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f8d0: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f8e0: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f8f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f900: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f910: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f920: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f930: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f940: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f950: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f960: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f970: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f980: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f990: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f9a0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f9b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f9c0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f9d0: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f9e0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f9f0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
fa00: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
fa10: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
fa20: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
fa30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
fa40: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
fa50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
fa60: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
fa70: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
fa80: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
fa90: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
faa0: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
fab0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
fac0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
fad0: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
fae0: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
faf0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
fb00: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
fb10: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
fb20: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
fb30: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
fb40: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
fb50: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
fb60: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
fb70: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
fb80: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
fb90: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fba0: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
fbb0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fbc0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
fbd0: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
fbe0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
fbf0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
fc00: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
fc10: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
fc20: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
fc30: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
fc40: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
fc50: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
fc60: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
fc70: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
fc80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
fc90: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
fca0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
fcb0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
fcc0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
fcd0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
fce0: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
fcf0: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
fd00: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
fd10: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
fd20: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
fd30: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
fd40: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
fd50: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
fd60: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
fd70: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
fd80: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
fdb0: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
fdc0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
fdd0: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
fde0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
fdf0: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
fe00: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
fe10: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
fe20: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
fe30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
fe40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
fe50: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
fe60: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
fe70: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
fe80: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
fe90: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
fea0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
feb0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
fec0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
fed0: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
fee0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
fef0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
ff00: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
ff10: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
ff20: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
ff30: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
ff40: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
ff50: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
ff60: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
ff70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
ff80: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
ff90: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
ffa0: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
ffb0: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
ffc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
ffd0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
ffe0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
fff0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
10000 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
10010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10020 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
10030 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
10040 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
10050 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
10060 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10070 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10080 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
10090 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
100a0 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
100b0 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
100c0 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
100d0 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
100e0 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
100f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
10100 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
10110 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
10120 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
10130 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10140 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
10150 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
10160 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
10170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
10180 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
10190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
101a0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
101b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
101c0 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
101d0 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
101e0 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
101f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
10200 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10210 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
10220 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
10230 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
10240 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
10250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10260 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
10270 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
10280 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
10290 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
102a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
102b0 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
102c0 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
102d0 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
102e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
102f0 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
10300 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
10310 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
10320 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
10330 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
10340 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
10350 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
10360 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
10370 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10380 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
10390 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
103a0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
103b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
103c0 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
103d0 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
103e0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
103f0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
10400 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10410 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
10420 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
10430 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
10440 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10450 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
10460 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
10470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10480 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
10490 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
104a0 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
104b0 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
104c0 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
104d0 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
104e0 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
104f0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
10500 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
10510 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
10520 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
10530 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
10540 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10550 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10560 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
10570 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
10580 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
10590 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
105a0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
105b0 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
105c0 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
105d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
105e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
105f0 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
10600 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
10610 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
10620 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
10630 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
10640 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
10650 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
10660 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
10670 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
10680 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
10690 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
106a0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
106b0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
106c0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
106d0 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
106e0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
106f0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
10700 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
10710 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
10720 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
10730 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
10740 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
10750 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10760 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10770 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10780 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10790 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
107a0 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
107b0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
107c0 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
107d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
107e0 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
107f0 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
10800 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
10810 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
10820 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
10850 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10860 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10870 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10880 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10890 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
108a0 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
108b0 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
108c0 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
108d0 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
108e0 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
108f0 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
10900 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
10910 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
10920 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
10930 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
10940 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
10950 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10960 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10970 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10980 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10990 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
109a0 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
109b0 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
109c0 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
109d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
109e0 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
109f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
10a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
10a10 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10a20 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
10a30 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10a40 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
10a50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10a60 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10a70 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10a80 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10a90 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10aa0 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10ab0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10ac0 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10ad0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10ae0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10af0 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
10b00 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
10b10 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
10b20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10b30 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
10b40 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
10b50 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10b60 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10b70 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10b80 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10b90 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10ba0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10bb0 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10bc0 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10bd0 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10be0 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10bf0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
10c00 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
10c10 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10c20 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
10c30 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
10c40 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
10c50 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10c60 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10c70 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10c80 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10c90 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10ca0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10cb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10cc0 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10cd0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10cf0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
10d00 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
10d10 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
10d20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
10d30 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
10d40 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
10d50 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10d60 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10d70 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10d80 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10d90 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10da0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10db0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10dc0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10dd0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10de0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10df0 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
10e00 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
10e10 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
10e20 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
10e30 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
10e40 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
10e50 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10e60 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10e70 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10e80 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10e90 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10ea0 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10eb0 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10ec0 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10ed0 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10ee0 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10ef0 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
10f00 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
10f10 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10f20 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10f30 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10f40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10f50 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10f60 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10f70 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10f80 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10f90 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10fa0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10fb0 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10fc0 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10fd0 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10fe0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10ff0 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
11000 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
11010 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
11020 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
11030 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
11040 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
11050 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
11060 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
11070 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
11080 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
110b0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
110c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110d0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
110e0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
110f0 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
11100 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
11110 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
11120 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
11130 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
11140 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
11170 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
11180 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
11190 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
111a0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
111b0 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
111c0 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
111d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
111e0 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
111f0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
11200 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
11210 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
11220 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
11230 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
11240 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
11250 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
11260 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
11270 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11280 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11290 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
112a0 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
112b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
112c0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
112d0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
112e0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
112f0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
11300 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
11310 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
11320 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
11330 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
11340 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
11350 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
11360 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
11370 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
11380 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
11390 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
113a0 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
113b0 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
113c0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
113d0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
113e0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
113f0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
11400 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
11410 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
11420 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
11430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
11440 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
11450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
11460 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
11470 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
11480 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
11490 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
114a0 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
114b0 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
114c0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
114d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
114e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
114f0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11500 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
11510 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
11520 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
11530 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
11540 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11550 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11560 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
11570 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
11580 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11590 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
115a0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
115b0 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
115c0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
115d0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
115e0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
115f0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
11600 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
11610 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
11620 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
11630 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
11640 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
11650 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
11660 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11670 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11680 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
11690 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20  lMagic, 8,.     
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72              iHdr
116c0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
116d0 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
116e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
116f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11700 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
11710 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
11720 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
11730 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
11740 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
11750 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
11760 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
11770 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
11780 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
11790 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
117a0 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
117b0 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
117c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
117d0 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
117e0 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
117f0 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
11800 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
11810 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
11820 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
11830 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
11840 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
11850 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
11860 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
11870 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
11880 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
11890 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
118a0 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
118b0 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
118c0 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
118d0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
118e0 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
118f0 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
11900 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
11910 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11920 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
11930 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
11940 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
11950 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
11960 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11970 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
11980 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11990 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
119a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
119b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
119c0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
119d0 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
119e0 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65  emory page-cache
119f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11a00 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
11a10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
11a20 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11a30 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  ion++;.  sqlite3
11a40 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
11a50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
11a60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
11a70 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
11a80 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
11a90 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65  Return the pPage
11aa0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20  r->iDataVersion 
11ab0 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c  value.*/.u32 sql
11ac0 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72  ite3PagerDataVer
11ad0 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  sion(Pager *pPag
11ae0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
11af0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
11b00 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65  GER_OPEN );.  re
11b10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61  turn pPager->iDa
11b20 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  taVersion;.}../*
11b30 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
11b40 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
11b50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
11b60 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
11b70 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
11b80 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
11b90 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
11ba0 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
11bb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
11bc0 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
11bd0 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
11be0 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
11bf0 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
11c00 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
11c10 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
11c20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
11c30 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
11c40 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
11c50 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
11c60 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
11c70 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
11c80 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11c90 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11ca0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
11cb0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
11cc0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
11cd0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
11ce0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
11cf0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11d00 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  || sqlite3Journa
11d10 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
11d20 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
11d30 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11d40 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
11d50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
11d60 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  e(pPager->aSavep
11d70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d  oint);.  pPager-
11d80 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >aSavepoint = 0;
11d90 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  .  pPager->nSave
11da0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11db0 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
11dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11dd0 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67  he bit number pg
11de0 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53  no in the PagerS
11df0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
11e00 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63  point .** bitvec
11e10 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61  s of all open sa
11e20 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e  vepoints. Return
11e30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
11e40 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53  ccessful.** or S
11e50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
11e60 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
11e70 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
11e80 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70  c int addToSavep
11e90 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65  ointBitvecs(Page
11ea0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11eb0 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b  pgno){.  int ii;
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
11ee0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
11ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
11f00 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11f10 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b   */..  for(ii=0;
11f20 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11f30 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11f40 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
11f50 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
11f60 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a  aSavepoint[ii];.
11f70 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d      if( pgno<=p-
11f80 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >nOrig ){.      
11f90 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74  rc |= sqlite3Bit
11fa0 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76  vecSet(p->pInSav
11fb0 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  epoint, pgno);. 
11fc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
11fd0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11fe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
11ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
12000 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
12010 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
12020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12030 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12040 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 2f  MIT_CONCURRENT./
12050 2a 0a 2a 2a 20 49 66 20 74 68 65 79 20 61 72 65  *.** If they are
12060 20 6e 6f 74 20 61 6c 72 65 61 64 79 2c 20 62 65   not already, be
12070 67 69 6e 20 72 65 63 6f 72 64 69 6e 67 20 61 6c  gin recording al
12080 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
12090 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
120a0 72 0a 2a 2a 20 62 79 20 74 68 65 20 62 2d 74 72  r.** by the b-tr
120b0 65 65 20 6c 61 79 65 72 20 54 68 69 73 20 69 73  ee layer This is
120c0 20 75 73 65 64 20 62 79 20 63 6f 6e 63 75 72 72   used by concurr
120d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
120e0 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  . Return.** SQLI
120f0 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
12100 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
12110 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 53 51  e error code (SQ
12120 4c 49 54 45 5f 4e 4f 4d 45 4d 29 20 69 66 20 61  LITE_NOMEM) if a
12130 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
12140 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
12150 33 50 61 67 65 72 42 65 67 69 6e 43 6f 6e 63 75  3PagerBeginConcu
12160 72 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61  rrent(Pager *pPa
12170 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
12180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12190 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65  ( pPager->pAllRe
121a0 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ad==0 ){.    pPa
121b0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d 20  ger->pAllRead = 
121c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
121d0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
121e0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
121f0 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
12200 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
12210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
12220 6c 6c 52 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20  llRead==0 ){.   
12230 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12240 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
12250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12260 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
12270 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45  TE_OMIT_CONCURRE
12280 4e 54 29 0a 2a 2a 0a 2a 2a 20 53 74 6f 70 20 72  NT).**.** Stop r
12290 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67  ecording all pag
122a0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
122b0 20 70 61 67 65 72 20 6c 61 79 65 72 20 62 79 20   pager layer by 
122c0 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
122d0 0a 2a 2a 20 61 6e 64 20 64 69 73 63 61 72 64 20  .** and discard 
122e0 61 6e 79 20 63 75 72 72 65 6e 74 20 72 65 63 6f  any current reco
122f0 72 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rds..*/.void sql
12300 69 74 65 33 50 61 67 65 72 45 6e 64 43 6f 6e 63  ite3PagerEndConc
12310 75 72 72 65 6e 74 28 50 61 67 65 72 20 2a 70 50  urrent(Pager *pP
12320 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
12330 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
12340 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 29 3b  ager->pAllRead);
12350 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  .  pPager->pAllR
12360 65 61 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 21  ead = 0;.}../* !
12370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12380 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a  MIT_CONCURRENT).
12390 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
123a0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
123b0 65 20 69 73 20 69 6e 20 77 61 6c 20 6d 6f 64 65  e is in wal mode
123c0 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73  . False otherwis
123d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
123e0 33 50 61 67 65 72 49 73 57 61 6c 28 50 61 67 65  3PagerIsWal(Page
123f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
12400 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 57 61  turn pPager->pWa
12410 6c 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  l!=0;.}.#endif /
12420 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
12430 4e 43 55 52 52 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NCURRENT */../*.
12440 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
12450 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64  r.pInJournal and
12460 20 50 61 67 65 72 2e 70 41 6c 6c 52 65 61 64 20   Pager.pAllRead 
12470 62 69 74 76 65 63 20 6f 62 6a 65 63 74 73 2e 0a  bitvec objects..
12480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
12490 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73 28  agerFreeBitvecs(
124a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
124b0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
124c0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
124d0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
124e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
124f0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
12500 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e  agerEndConcurren
12510 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
12520 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12530 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
12540 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12550 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
12560 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
12570 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
12580 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
12590 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
125a0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
125b0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
125c0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
125d0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
125e0 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
125f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
12600 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
12610 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
12620 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
12630 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
12640 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
12650 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
12660 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
12670 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
12680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
12690 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
126a0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
126b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
126c0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
126d0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
126e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
126f0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
12700 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12710 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
12720 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
12730 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
12740 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
12750 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
12760 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
12770 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
12780 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
12790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
127a0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
127b0 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
127c0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
127d0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
127e0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
127f0 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
12800 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
12810 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
12820 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
12830 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
12840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12850 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
12860 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
12870 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
12880 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
12890 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
128a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
128b0 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
128c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
128d0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
128e0 20 20 29 3b 0a 0a 20 20 70 61 67 65 72 46 72 65    );..  pagerFre
128f0 65 42 69 74 76 65 63 73 28 70 50 61 67 65 72 29  eBitvecs(pPager)
12900 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ;.  releaseAllSa
12910 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
12920 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
12930 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
12940 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
12950 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
12960 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   );.    sqlite3W
12970 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
12980 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
12990 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
129a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
129b0 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  PEN;.  }else if(
129c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
129d0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
129e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a00 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  Error code retur
12a10 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f  ned by pagerUnlo
12a20 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e  ckDb() */.    in
12a30 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70  t iDc = isOpen(p
12a40 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74  Pager->fd)?sqlit
12a50 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
12a60 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
12a70 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a  ->fd):0;..    /*
12a80 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   If the operatin
12a90 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  g system support
12aa0 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65   deletion of ope
12ab0 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20  n files, then.  
12ac0 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a    ** close the j
12ad0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
12ae0 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61   dropping the da
12af0 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74  tabase lock.  Ot
12b00 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
12b10 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
12b20 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
12b30 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
12b40 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
12b50 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d  .    ** out from
12b60 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a   under us..    *
12b70 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
12b80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12b90 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d  _MEMORY   & 5)!=
12ba0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12bb0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12bc0 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35  ODE_OFF      & 5
12bd0 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12be0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12bf0 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20  ALMODE_WAL      
12c00 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12c10 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12c20 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
12c30 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12c40 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12c50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
12c60 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b  NCATE & 5)==1 );
12c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12c80 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12c90 50 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31  PERSIST  & 5)==1
12ca0 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   );.    if( 0==(
12cb0 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
12cc0 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
12cd0 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c  HEN_OPEN).     |
12ce0 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f  | 1!=(pPager->jo
12cf0 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20  urnalMode & 5). 
12d00 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
12d10 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
12d20 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a  r->jfd);.    }..
12d30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
12d40 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52  ger is in the ER
12d50 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68  ROR state and th
12d60 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b  e call to unlock
12d70 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
12d80 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c    ** file fails,
12d90 20 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   set the current
12da0 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e   lock to UNKNOWN
12db0 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63  _LOCK. See the c
12dc0 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62  omment.    ** ab
12dd0 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
12de0 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  for UNKNOWN_LOCK
12df0 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
12e00 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a  ion of why this.
12e10 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73      ** is necess
12e20 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
12e30 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  rc = pagerUnlock
12e40 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f  Db(pPager, NO_LO
12e50 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
12e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
12e70 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
12e80 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  GER_ERROR ){.   
12e90 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
12ea0 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b   = UNKNOWN_LOCK;
12eb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
12ec0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d  he pager state m
12ed0 61 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72  ay be changed fr
12ee0 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74  om PAGER_ERROR t
12ef0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72  o PAGER_OPEN her
12f00 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74  e.    ** without
12f10 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72   clearing the er
12f20 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69  ror code. This i
12f30 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20  s intentional - 
12f40 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a  the error.    **
12f50 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64   code is cleared
12f60 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72   and the cache r
12f70 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63  eset in the bloc
12f80 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a  k below..    */.
12f90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12fa0 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70  er->errCode || p
12fb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
12fc0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
12fd0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
12fe0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
12ff0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13000 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
13010 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67    }..  /* If Pag
13020 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65  er.errCode is se
13030 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
13040 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
13050 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a  he cannot be.  *
13060 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74  * trusted. Now t
13070 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
13080 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
13090 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
130a0 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61  ager,.  ** it ca
130b0 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61  n safely move ba
130c0 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  ck to PAGER_OPEN
130d0 20 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70   state. This hap
130e0 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a  pens in both.  *
130f0 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63  * normal and exc
13100 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d  lusive-locking m
13110 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
13120 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
13130 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
13140 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  | !MEMDB );.  if
13150 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
13160 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
13170 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
13180 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
13190 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
131a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
131b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
131c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
131d0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
131e0 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  PEN;.    }else{.
131f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
13200 74 61 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70  tate = (isOpen(p
13210 50 61 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41  Pager->jfd) ? PA
13220 47 45 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52  GER_OPEN : PAGER
13230 5f 52 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a  _READER);.    }.
13240 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
13250 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
13260 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
13270 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
13280 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
13290 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
132a0 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74      setGetterMet
132b0 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  hod(pPager);.  }
132c0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
132d0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  nalOff = 0;.  pP
132e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
132f0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
13300 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d  setMaster = 0;.}
13310 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13320 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13330 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52  whenever an IOER
13340 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20  R or FULL error 
13350 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a  that requires.**
13360 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 72   the pager to tr
13370 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ansition into th
13380 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61  e ERROR state ma
13390 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e  y ahve occurred.
133a0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
133b0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
133c0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72  ter to the pager
133d0 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
133e0 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65  second .** the e
133f0 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
13400 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
13410 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
13420 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20  nction. The .** 
13430 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
13440 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
13450 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13460 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
13470 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
13480 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13490 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  is SQLITE_FULL, 
134a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
134b0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f  one of the.** IO
134c0 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74  ERR sub-codes, t
134d0 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73 20  he pager enters 
134e0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
134f0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
13500 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20  de.** is stored 
13510 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  in Pager.errCode
13520 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  . While the page
13530 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65  r remains in the
13540 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a   ERROR state,.**
13550 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63   all major API c
13560 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65  alls on the Page
13570 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
13580 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e  ly return Pager.
13590 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  errCode..**.** T
135a0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
135b0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
135c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
135d0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
135e0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
135f0 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
13600 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
13610 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
13620 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
13630 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13640 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
13650 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
13660 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
13670 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
13680 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
13690 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
136a0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
136b0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
136c0 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
136d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
136e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
136f0 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
13700 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
13710 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
13720 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
13730 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
13740 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
13750 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
13760 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
13770 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
13780 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
13790 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
137a0 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
137b0 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
137c0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
137d0 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
137e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
137f0 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
13800 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
13810 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
13820 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45  L || rc2==SQLITE
13830 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50  _IOERR ){.    pP
13840 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13850 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
13860 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  eState = PAGER_E
13870 52 52 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74  RROR;.    setGet
13880 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
13890 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
138a0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
138b0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
138c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
138d0 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a  Pgno nPage);../*
138e0 0a 2a 2a 20 54 68 65 20 77 72 69 74 65 20 74 72  .** The write tr
138f0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
13900 6e 20 70 50 61 67 65 72 20 69 73 20 62 65 69 6e  n pPager is bein
13910 67 20 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f  g committed (bCo
13920 6d 6d 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72  mmit==1).** or r
13930 6f 6c 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d  olled back (bCom
13940 6d 69 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52  mit==0)..**.** R
13950 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e  eturn TRUE if an
13960 64 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69  d only if all di
13970 72 74 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64  rty pages should
13980 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
13990 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73  isk..**.** Rules
139a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72  :.**.**   *  For
139b0 20 6e 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61   non-TEMP databa
139c0 73 65 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63  ses, always sync
139d0 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
139e0 69 73 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20  is necessary.** 
139f0 20 20 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63       for transac
13a00 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61  tions to be dura
13a10 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ble..**.**   *  
13a20 53 79 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61  Sync TEMP databa
13a30 73 65 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d  se only on a COM
13a40 4d 49 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42  MIT (not a ROLLB
13a50 41 43 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61  ACK) when the ba
13a60 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69  cking.**      fi
13a70 6c 65 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  le has been crea
13a80 74 65 64 20 61 6c 72 65 61 64 79 20 28 76 69 61  ted already (via
13a90 20 61 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65   a spill on page
13aa0 72 53 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a  rStress()) and.*
13ab0 2a 20 20 20 20 20 20 77 68 65 6e 20 74 68 65 20  *      when the 
13ac0 6e 75 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20  number of dirty 
13ad0 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
13ae0 65 78 63 65 65 64 73 20 32 35 25 20 6f 66 20 74  exceeds 25% of t
13af0 68 65 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20  he total.**     
13b00 20 63 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a   cache size..*/.
13b10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13b20 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61  FlushOnCommit(Pa
13b30 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
13b40 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28   bCommit){.  if(
13b50 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
13b60 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
13b70 0a 20 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20  .  if( !bCommit 
13b80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
13b90 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
13ba0 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e 20 30  ->fd) ) return 0
13bb0 3b 0a 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69  ;.  return (sqli
13bc0 74 65 33 50 43 61 63 68 65 50 65 72 63 65 6e 74  te3PCachePercent
13bd0 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
13be0 43 61 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a  Cache)>=25);.}..
13bf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13c00 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
13c10 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
13c20 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
13c30 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
13c40 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
13c50 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
13c60 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
13c70 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
13c80 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
13c90 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
13ca0 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
13cb0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
13cc0 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
13cd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13ce0 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
13cf0 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
13d00 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
13d10 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
13d20 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ion..** .** This
13d30 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
13d40 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45  r called in PAGE
13d50 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49  R_ERROR state. I
13d60 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a  f it is called.*
13d70 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20  * in PAGER_NONE 
13d80 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  or PAGER_SHARED 
13d90 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f  state and the lo
13da0 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a  ck held is less.
13db0 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61  ** exclusive tha
13dc0 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
13dd0 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  k, it is a no-op
13de0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
13df0 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
13e00 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
13e10 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
13e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13e30 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
13e40 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
13e50 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
13e60 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
13e70 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
13e80 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
13e90 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
13ea0 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
13eb0 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
13ec0 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
13ed0 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
13ee0 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
13ef0 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
13f00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13f10 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
13f20 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
13f30 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
13f40 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
13f50 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
13f60 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13f70 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
13f80 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
13f90 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
13fa0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
13fb0 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
13fc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
13fd0 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
13fe0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
13ff0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
14000 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
14010 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
14020 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
14030 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
14040 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
14050 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
14060 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
14070 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
14080 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
14090 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
140a0 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
140b0 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
140c0 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
140d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
140e0 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
140f0 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
14100 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
14110 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
14120 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
14130 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
14140 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
14150 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
14160 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
14170 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
14180 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
14190 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
141a0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
141b0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
141c0 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
141d0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
141e0 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
141f0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
14200 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
14210 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
14220 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
14230 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
14240 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
14250 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
14260 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
14270 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
14280 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
14290 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
142a0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
142b0 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
142c0 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
142d0 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
142e0 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
142f0 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
14300 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
14310 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65  alized, the page
14320 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52  r moves to PAGER
14330 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a  _READER state..*
14340 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
14350 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f  non-exclusive ro
14360 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65  llback mode, the
14370 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
14380 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61  e is .** downgra
14390 64 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f  ded to a SHARED_
143a0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
143b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
143c0 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
143d0 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f  curs. If an erro
143e0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a  r occurs during.
143f0 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f  ** any of the IO
14400 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66   operations to f
14410 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
14420 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f  nal file or unlo
14430 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
14440 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  se then the IO e
14450 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14460 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
14470 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70  r. If the .** op
14480 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c  eration to final
14490 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
144a0 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e  file fails, then
144b0 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a   the code still.
144c0 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f  ** tries to unlo
144d0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
144e0 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65  file if not in e
144f0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49  xclusive mode. I
14500 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20  f the.** unlock 
14510 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20  operation fails 
14520 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68  as well, then th
14530 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f  e first error co
14540 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f  de related.** to
14550 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
14560 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68   encountered (th
14570 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  e journal finali
14580 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a  zation one) is.*
14590 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  * returned..*/.s
145a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
145b0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
145c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
145d0 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e  nt hasMaster, in
145e0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e  t bCommit){.  in
145f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14600 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  ;      /* Error 
14610 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  code from journa
14620 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
14630 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
14640 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
14650 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  K;     /* Error 
14660 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c  code from db fil
14670 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  e unlock operati
14680 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  on */..  /* Do n
14690 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61  othing if the pa
146a0 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
146b0 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
146c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
146d0 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52   or at least a R
146e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68  ESERVED lock. Th
146f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
14700 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
14710 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
14720 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
14730 6e 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52  n active but a R
14740 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
14750 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20  er lock is.  ** 
14760 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63  held under two c
14770 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20  ircumstances:.  
14780 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74  **.  **   1. Aft
14790 65 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  er a successful 
147a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
147b0 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c  back, it is call
147c0 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20  ed with.  **    
147d0 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f    eState==PAGER_
147e0 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d  NONE and eLock==
147f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
14800 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49    **.  **   2. I
14810 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  f a connection w
14820 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ith locking_mode
14830 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69  =exclusive holdi
14840 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
14850 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20  .  **      lock 
14860 73 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f  switches back to
14870 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f   locking_mode=no
14880 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78  rmal and then ex
14890 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20  ecutes a.  **   
148a0 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74     read-transact
148b0 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ion, this functi
148c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  on is called wit
148d0 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  h eState==PAGER_
148e0 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20  READER .  **    
148f0 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43    and eLock==EXC
14900 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e  LUSIVE_LOCK when
14910 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
14920 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
14930 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14940 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
14950 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
14960 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14970 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
14980 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ROR );.  if( pPa
14990 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
149a0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
149b0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
149c0 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  <RESERVED_LOCK )
149d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
149e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
149f0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
14a00 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61  nts(pPager);.  a
14a10 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
14a20 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
14a30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14a40 3d 3d 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 73  ==0 .      || (s
14a50 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
14a60 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
14a70 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
14a80 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f  _IOCAP_BATCH_ATO
14a90 4d 49 43 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  MIC).  );.  if( 
14aa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
14ab0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
14ac0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
14ad0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
14ae0 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
14af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
14b00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14b10 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14b20 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  y(pPager->jfd) )
14b30 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
14b40 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14b50 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14b60 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14b70 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c   ); */.      sql
14b80 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
14b90 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
14ba0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
14bb0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14bc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
14bd0 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
14be0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14bf0 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
14c00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14c10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
14c20 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14c30 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
14c40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
14c50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14c70 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
14c90 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
14ca0 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  ew file size is 
14cb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14cc0 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61   inode right awa
14cd0 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y..          ** 
14ce0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f  Otherwise the jo
14cf0 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75  urnal might resu
14d00 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  rrect following 
14d10 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64  a power loss and
14d20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
14d30 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61  use the last tra
14d40 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c  nsaction to roll
14d50 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20   back.  See.    
14d60 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f        ** https:/
14d70 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c  /bugzilla.mozill
14d80 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63  a.org/show_bug.c
14d90 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20  gi?id=1072773.  
14da0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14db0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14dc0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14dd0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14de0 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
14df0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14e00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14e10 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
14e20 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
14e30 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14e40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
14e50 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
14e60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14e70 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
14e80 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
14e90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14ea0 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
14eb0 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
14ec0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
14ed0 73 4d 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d  sMaster||pPager-
14ee0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
14ef0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14f00 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
14f10 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
14f20 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
14f30 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
14f40 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
14f50 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
14f60 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
14f70 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
14f80 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
14f90 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
14fa0 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
14fb0 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
14fc0 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
14fd0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
14fe0 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
14ff0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
15000 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
15010 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
15020 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
15030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15040 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70  int bDelete = !p
15050 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15060 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
15070 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
15080 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
15090 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  jfd)==0 );.     
150a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
150b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
150c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
150d0 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
150e0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
150f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
15100 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
15110 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
15120 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
15130 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
15140 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
15150 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
15160 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
15170 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
15180 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a   if( bDelete ){.
15190 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
151a0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
151b0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
151c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
151d0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b  ger->extraSync);
151e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
151f0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15200 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
15210 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
15220 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
15230 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
15240 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
15250 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
15260 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
15270 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
15280 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15290 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
152a0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67   *p = sqlite3Pag
152b0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
152c0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   1);.    if( p )
152d0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48  {.      p->pageH
152e0 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ash = 0;.      s
152f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
15300 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20  NotNull(p);.    
15310 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
15320 70 61 67 65 72 46 72 65 65 42 69 74 76 65 63 73  pagerFreeBitvecs
15330 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
15340 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
15350 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15360 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d  K ){.    if( MEM
15370 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75 73 68  DB || pagerFlush
15380 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c  OnCommit(pPager,
15390 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20   bCommit) ){.   
153a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
153b0 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
153c0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d  >pPCache);.    }
153d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
153e0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 57 72  te3PcacheClearWr
153f0 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d 3e 70  itable(pPager->p
15400 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20  PCache);.    }. 
15410 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15420 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
15430 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
15440 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
15450 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
15460 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
15470 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
15480 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
15490 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
154a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
154b0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
154c0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
154d0 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
154e0 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
154f0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
15500 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
15510 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15520 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
15530 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
15540 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
15550 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
15560 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
15570 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
15580 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
15590 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
155a0 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
155b0 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
155c0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
155d0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
155e0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
155f0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
15600 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
15610 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
15620 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
15630 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
15640 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
15650 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
15660 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
15670 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
15680 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
15690 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
156a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
156b0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
156c0 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
156d0 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
156e0 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
156f0 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
15700 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
15710 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
15720 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
15730 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
15740 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
15750 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
15760 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15770 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
15780 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
15790 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
157a0 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
157b0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
157c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
157d0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
157e0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
157f0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  ->fd) ){.    rc 
15800 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
15810 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
15820 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
15830 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c  COMMIT_PHASETWO,
15840 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
15850 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
15860 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
15870 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
15880 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
15890 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
158a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
158b0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
158c0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
158d0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
158e0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
158f0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
15900 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
15910 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
15920 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
15930 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
15940 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
15950 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
15960 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
15970 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
15980 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
15990 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
159a0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
159b0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
159c0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
159d0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
159e0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
159f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
15a00 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
15a10 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
15a20 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
15a30 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
15a40 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
15a50 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
15a60 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
15a70 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
15a80 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
15a90 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
15aa0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
15ab0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
15ac0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15ad0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
15ae0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
15af0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
15b00 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
15b10 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
15b20 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
15b30 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
15b40 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
15b50 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
15b60 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
15b70 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
15b80 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
15b90 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
15ba0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
15bb0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15bc0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
15bd0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
15be0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
15bf0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
15c00 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
15c10 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
15c20 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
15c30 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
15c40 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
15c50 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
15c60 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
15c70 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
15c80 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
15c90 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
15ca0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
15cb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
15cc0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
15cd0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
15ce0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
15cf0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
15d00 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
15d10 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15d20 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
15d30 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
15d40 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
15d50 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
15d60 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
15d70 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
15d80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
15d90 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
15da0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15db0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
15dc0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
15dd0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
15de0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
15df0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
15e00 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
15e10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15e20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15e30 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
15e40 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
15e50 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15e60 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15e70 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
15e80 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
15e90 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
15ea0 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
15eb0 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
15ec0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
15ed0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
15ee0 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
15ef0 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
15f00 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
15f10 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
15f20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
15f30 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15f40 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
15f50 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
15f60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
15f70 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
15f80 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
15f90 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
15fa0 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
15fb0 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
15fc0 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
15fd0 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
15fe0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
15ff0 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
16000 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
16010 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
16020 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
16030 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
16040 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
16050 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
16060 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
16070 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
16080 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
16090 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
160a0 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
160b0 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
160c0 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
160d0 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
160e0 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
160f0 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
16100 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
16110 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
16120 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
16130 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
16140 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
16150 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
16160 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
16170 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
16180 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
16190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
161a0 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
161b0 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
161c0 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
161d0 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
161e0 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
161f0 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
16200 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
16210 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
16220 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
16230 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
16240 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
16250 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
16260 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
16270 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
16280 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
16290 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
162a0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
162b0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
162c0 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
162d0 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
162e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
162f0 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
16300 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
16310 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
16320 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
16330 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
16340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
16350 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
16360 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
16370 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
16380 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
16390 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
163a0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
163b0 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
163c0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
163d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
163e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
163f0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
16400 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
16410 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
16420 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
16430 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
16440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16450 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
16460 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
16470 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
16480 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
16490 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
164a0 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
164b0 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
164c0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69  ec */.#endif..#i
164d0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
164e0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  CODEC./*.** Make
164f0 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72   sure the number
16500 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74   of reserved bit
16510 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e  s is the same in
16520 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
16530 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20  .** pager as it 
16540 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65  is in the source
16550 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70  .  This comes up
16560 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63   when a VACUUM c
16570 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75  hanges the.** nu
16580 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
16590 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70   bits to the "op
165a0 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a  timal" amount..*
165b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
165c0 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28  gerAlignReserve(
165d0 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61  Pager *pDest, Pa
165e0 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66  ger *pSrc){.  if
165f0 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76  ( pDest->nReserv
16600 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76  e!=pSrc->nReserv
16610 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e  e ){.    pDest->
16620 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d  nReserve = pSrc-
16630 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  >nReserve;.    p
16640 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
16650 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  Dest);.  }.}.#en
16660 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
16670 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
16680 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
16690 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
166a0 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
166b0 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
166c0 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
166d0 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
166e0 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
166f0 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
16700 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
16710 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
16720 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
16730 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
16740 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
16750 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16760 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
16770 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
16780 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
16790 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63  k journal uses c
167a0 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
167b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
167c0 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a   does .** not..*
167d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
167e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
167f0 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
16800 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
16810 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
16820 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
16830 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
16840 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
16850 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
16860 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
16870 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
16880 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
16890 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
168a0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
168b0 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
168c0 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
168d0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
168e0 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
168f0 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
16900 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
16910 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
16920 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
16930 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
16940 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
16950 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
16960 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
16970 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
16980 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
16990 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
169a0 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
169b0 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
169c0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
169d0 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
169e0 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
169f0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16a00 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
16a10 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
16a20 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16a30 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
16a40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
16a50 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
16a60 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
16a70 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16a80 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
16a90 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
16aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16ab0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
16ac0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16ad0 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
16ae0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
16af0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
16b00 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
16b10 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
16b20 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
16b30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16b40 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
16b50 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
16b60 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
16b70 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
16b80 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
16b90 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
16ba0 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
16bb0 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
16bc0 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
16bd0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
16be0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
16bf0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
16c00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16c10 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
16c20 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
16c30 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
16c40 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
16c50 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
16c60 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
16c70 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
16c80 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
16c90 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
16ca0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
16cb0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16cc0 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
16cd0 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
16ce0 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
16cf0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
16d00 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
16d10 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
16d20 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
16d30 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
16d40 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
16d50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16d60 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
16d70 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
16d80 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16da0 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
16db0 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
16dc0 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20  64 *pOffset,    
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16de0 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64  Offset of record
16df0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a   to playback */.
16e00 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c    Bitvec *pDone,
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
16e30 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
16e40 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d back */.  int 
16e50 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20  isMainJrnl,     
16e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
16e70 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20  > main journal. 
16e80 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  0 -> sub-journal
16e90 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  . */.  int isSav
16ea0 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  epnt            
16eb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
16ec0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
16ed0 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lback */.){.  in
16ee0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
16ef0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
16f00 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
16f10 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
16f20 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
16f30 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
16f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16f50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16f60 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
16f70 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
16f80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16f90 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
16fa0 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
16fb0 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63   checking */.  c
16fc0 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20  har *aData;     
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fe0 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
16ff0 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
17000 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
17010 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
17020 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
17030 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
17040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
17050 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b  .  int isSynced;
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17070 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
17080 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63  nal page is sync
17090 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed */.#ifdef SQL
170a0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
170b0 2f 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66  /* The jrnlEnc f
170c0 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 4a  lag is true if J
170d0 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f  ournal pages sho
170e0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
170f0 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63  rough.  ** the c
17100 6f 64 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c  odec.  It is fal
17110 73 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d  se for pure in-m
17120 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20  emory journals. 
17130 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a  */.  const int j
17140 72 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e  rnlEnc = (isMain
17150 4a 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Jrnl || pPager->
17160 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29  subjInMemory==0)
17170 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
17180 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
17190 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
171a0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
171b0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
171c0 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
171d0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
171e0 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
171f0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
17200 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
17210 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
17220 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
17230 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
17240 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
17250 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
17260 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
17270 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
17280 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
17290 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
172a0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
172b0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
172c0 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
172d0 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
172e0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
172f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
17300 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
17310 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
17320 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
17330 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
17340 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
17350 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
17360 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
17370 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
17380 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
17390 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
173a0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
173b0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
173c0 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
173d0 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
173e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
173f0 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
17400 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17410 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
17420 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
17430 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
17440 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17450 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
17460 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
17470 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
17480 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
17490 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
174a0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
174b0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
174c0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
174d0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
174e0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
174f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
17500 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
17510 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
17520 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
17530 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
17540 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
17550 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
17560 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
17570 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
17580 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
17590 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
175a0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
175b0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
175c0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
175d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
175e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
175f0 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
17600 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
17610 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
17620 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
17630 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
17640 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
17650 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
17660 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17670 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
17680 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
17690 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
176a0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
176b0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
176c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
176d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
176e0 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
176f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
17700 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
17710 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
17720 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
17730 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
17740 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
17750 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
17760 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
17770 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
17780 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
17790 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
177a0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
177b0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
177c0 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
177d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
177e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
177f0 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
17800 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
17810 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
17820 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
17830 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
17840 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
17850 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
17860 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
17870 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
17880 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
17890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
178a0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
178b0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
178c0 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
178d0 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
178e0 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
178f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
17910 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
17920 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
17930 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
17940 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
17950 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
17960 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
17970 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
17980 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
17990 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
179a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
179b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
179c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
179d0 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
179e0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
179f0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72   back before dur
17a00 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
17a10 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
17a20 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
17a30 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
17a40 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
17a50 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
17a60 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
17a70 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
17a80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17a90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17aa0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
17ab0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
17ac0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
17ad0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
17ae0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
17af0 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
17b00 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
17b10 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
17b20 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
17b30 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
17b40 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
17b50 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
17b60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
17b70 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
17b80 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
17b90 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
17ba0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
17bb0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
17bc0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
17bd0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
17be0 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
17bf0 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
17c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17c10 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
17c20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
17c30 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
17c40 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
17c50 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
17c60 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
17c70 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
17c80 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
17c90 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
17ca0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
17cb0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
17cc0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
17cd0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
17ce0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17cf0 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
17d00 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
17d10 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
17d20 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
17d30 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
17d40 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
17d50 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
17d60 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
17d70 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
17d80 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
17d90 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
17da0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
17db0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
17dc0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
17dd0 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
17de0 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
17df0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
17e00 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
17e10 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
17e20 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
17e30 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
17e40 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
17e50 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
17e60 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
17e70 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
17e80 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
17e90 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
17ea0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
17eb0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
17ec0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
17ed0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
17ee0 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
17ef0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
17f00 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
17f10 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
17f20 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
17f30 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
17f40 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
17f50 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
17f60 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
17f70 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
17f80 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
17f90 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17fa0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
17fb0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
17fc0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
17fd0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
17fe0 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
17ff0 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
18000 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
18010 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
18020 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
18030 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
18040 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
18050 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
18060 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
18070 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
18080 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
18090 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
180a0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
180b0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
180c0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
180d0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
180e0 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
180f0 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
18100 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
18110 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
18120 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
18130 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
18140 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
18150 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
18160 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
18170 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
18180 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
18190 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
181a0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
181b0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
181c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
181d0 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
181e0 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
181f0 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
18200 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
18210 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
18220 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
18230 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
18240 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
18250 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
18260 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
18270 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
18280 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
18290 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
182a0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
182b0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
182c0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
182d0 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
182e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
182f0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
18300 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
18310 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
18320 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
18330 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
18340 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
18350 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
18360 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
18370 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
18380 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18390 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
183a0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
183b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
183c0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
183d0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
183e0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
183f0 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
18400 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
18410 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
18420 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
18430 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Pg==0 || pPager-
18440 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50  >tempFile );.  P
18450 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
18460 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
18470 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
18480 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
18490 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
184a0 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
184b0 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
184c0 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
184d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
184e0 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
184f0 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
18500 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
18510 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
18520 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
18530 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
18540 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
18550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18560 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
18570 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
18580 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
18590 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
185a0 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
185b0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
185c0 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
185d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
185e0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
185f0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
18600 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
18610 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
18620 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
18630 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
18640 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
18650 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
18660 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
18670 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
18680 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
18690 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
186a0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
186b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
186c0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
186d0 68 65 20 64 61 74 61 20 72 65 61 64 20 66 72 6f  he data read fro
186e0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  m the journal ba
186f0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
18700 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
18710 2a 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  * This is usuall
18720 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20  y safe even for 
18730 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
18740 61 62 61 73 65 20 2d 20 61 73 20 74 68 65 20 64  abase - as the d
18750 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  ata.    ** was e
18760 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72 65 20  ncrypted before 
18770 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  it was written t
18780 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
18790 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  le. The exceptio
187a0 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74  n.    ** is if t
187b0 68 65 20 64 61 74 61 20 77 61 73 20 6a 75 73 74  he data was just
187c0 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e   read from an in
187d0 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
187e0 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20  nal. In that.   
187f0 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74   ** case it must
18800 20 62 65 20 65 6e 63 72 79 70 74 65 64 20 68 65   be encrypted he
18810 72 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  re before it is 
18820 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
18830 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
18840 66 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66  file.  */.#ifdef
18850 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
18860 43 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45  C.    if( !jrnlE
18870 6e 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  nc ){.      CODE
18880 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
18890 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
188a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
188b0 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72   aData);.      r
188c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
188d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
188e0 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67  u8 *)aData, pPag
188f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
18900 73 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  st);.      CODEC
18910 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
18920 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
18930 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18940 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
18950 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
18960 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
18970 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
18980 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
18990 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20  ize, ofst);..   
189a0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
189b0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
189c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
189d0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
189e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
189f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
18a00 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18a10 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20  HAS_CODEC.      
18a20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20  if( jrnlEnc ){. 
18a30 20 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50         CODEC1(pP
18a40 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18a50 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
18a60 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20  NOMEM_BKPT);.   
18a70 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
18a80 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
18a90 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
18aa0 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
18ab0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
18ac0 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18ad0 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
18ae0 4d 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b  MEM_BKPT,aData);
18af0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
18b00 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
18b10 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
18b20 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
18b30 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
18b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
18b50 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
18b60 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
18b70 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
18b80 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
18b90 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
18ba0 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
18bb0 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
18bc0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
18bd0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
18be0 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
18bf0 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
18c00 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
18c10 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
18c20 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
18c30 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
18c40 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
18c50 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
18c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
18c70 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
18c80 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
18c90 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
18ca0 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
18cb0 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
18cc0 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
18cd0 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
18ce0 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
18cf0 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
18d00 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
18d10 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
18d20 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
18d30 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
18d40 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
18d50 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
18d60 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
18d70 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
18d80 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
18d90 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
18da0 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
18db0 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
18dc0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
18dd0 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
18de0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
18df0 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
18e00 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
18e10 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
18e20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
18e30 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
18e40 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
18e50 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
18e60 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
18e70 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
18e80 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
18e90 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
18ea0 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
18eb0 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
18ec0 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
18ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
18ee0 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
18ef0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
18f00 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
18f10 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
18f20 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20  LBACK)==0 );.   
18f30 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
18f40 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
18f50 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72  _ROLLBACK;.    r
18f60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18f70 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
18f80 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
18f90 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
18fa0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
18fb0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18fc0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )!=0 );.    pPag
18fd0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18fe0 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  = ~SPILLFLAG_ROL
18ff0 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72  LBACK;.    if( r
19000 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
19020 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
19030 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
19040 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
19050 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
19060 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
19070 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
19080 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
19090 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
190a0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
190b0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
190c0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
190d0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
190e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
190f0 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
19100 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
19110 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
19120 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
19130 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
19140 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
19150 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
19160 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
19170 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
19180 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
19190 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
191a0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
191b0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
191c0 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
191d0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
191e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
191f0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
19200 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75  Pg);.    /* It u
19210 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73  sed to be that s
19220 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
19230 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63  Clean(pPg) was c
19240 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74  alled here.  But
19250 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c  .    ** that cal
19260 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20  l was dangerous 
19270 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63  and had no detec
19280 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69  table benefit si
19290 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20  nce the cache.  
192a0 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79    ** is normally
192b0 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69   cleaned by sqli
192c0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
192d0 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  l() after rollba
192e0 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a  ck and so.    **
192f0 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
19300 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  d. */.    pager_
19310 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
19320 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
19330 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
19340 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
19350 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
19360 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
19370 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
19380 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
19390 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
193a0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
193b0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
193c0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
193d0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
193e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
193f0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
19400 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
19410 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
19420 6f 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53  om disk */.#if S
19430 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
19440 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20      if( jrnlEnc 
19450 29 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  ){ CODEC1(pPager
19460 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
19470 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
19480 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a  _NOMEM_BKPT); }.
19490 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
194a0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
194b0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
194c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
194d0 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
194e0 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
194f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
19500 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
19510 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
19520 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
19530 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
19540 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
19550 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
19560 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
19570 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
19580 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
19590 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
195a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
195b0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
195c0 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
195d0 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
195e0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
195f0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
19600 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
19610 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
19620 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
19630 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
19640 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
19650 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19660 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
19670 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
19680 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
19690 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
196a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
196b0 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
196c0 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
196d0 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
196e0 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
196f0 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
19700 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
19710 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
19720 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
19730 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
19740 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
19750 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
19760 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
19770 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
19780 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
19790 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
197a0 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
197b0 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
197c0 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
197d0 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
197e0 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
197f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19800 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
19810 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
19820 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
19830 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
19840 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
19850 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19860 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
19870 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
19880 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
19890 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
198a0 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
198b0 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
198c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
198d0 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
198e0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
198f0 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
19900 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
19910 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
19920 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
19930 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
19940 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
19950 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
19960 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
19970 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
19980 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
19990 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
199a0 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
199b0 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
199c0 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
199d0 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
199e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
199f0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
19a00 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
19a10 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
19a20 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
19a30 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
19a40 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
19a50 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
19a60 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
19a70 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
19a80 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
19a90 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
19aa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
19ab0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
19ac0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
19ad0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
19ae0 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
19af0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
19b00 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
19b10 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
19b20 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
19b30 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
19b40 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
19b50 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
19b60 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
19b70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
19b80 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
19b90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
19ba0 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
19bb0 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
19bc0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
19bd0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
19be0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
19bf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
19c00 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
19c10 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
19c20 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
19c30 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
19c40 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
19c50 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
19c60 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
19c70 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
19c80 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
19c90 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
19ca0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
19cb0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
19cc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
19ce0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
19cf0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
19d00 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
19d10 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
19d20 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
19d30 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
19d40 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
19d50 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
19d60 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
19d70 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
19d80 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
19d90 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
19da0 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
19db0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19dc0 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
19dd0 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
19de0 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
19df0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19e00 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
19e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
19e20 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72  nter to one jour
19e30 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69  nal within MJ fi
19e40 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  le */.  char *zM
19e50 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19e60 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f    /* Space to ho
19e70 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66  ld MJ filename f
19e80 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  rom a journal fi
19e90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  le */.  int nMas
19ea0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19eb0 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73    /* Amount of s
19ec0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
19ed0 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a  o zMasterPtr[] *
19ee0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
19ef0 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20   space for both 
19f00 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64  the pJournal and
19f10 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65   pMaster file de
19f20 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20  scriptors..  ** 
19f30 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
19f40 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
19f50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
19f60 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  reading..  */.  
19f70 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
19f80 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
19f90 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73  3MallocZero(pVfs
19fa0 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
19fb0 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
19fc0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
19fd0 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
19fe0 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
19ff0 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
1a000 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a010 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1a020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
1a030 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
1a040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1a050 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
1a060 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
1a070 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a080 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
1a090 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
1a0a0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
1a0b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a0c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a0d0 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
1a0e0 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
1a0f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a100 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
1a110 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
1a120 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
1a130 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
1a140 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
1a150 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
1a160 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
1a170 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
1a180 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
1a190 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
1a1a0 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
1a1b0 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
1a1c0 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
1a1d0 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
1a1e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
1a1f0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1a200 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
1a210 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
1a220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a230 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a240 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
1a250 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
1a260 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
1a270 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
1a280 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
1a290 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
1a2a0 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28  rPtr + 1);.  if(
1a2b0 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
1a2c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a2d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1a2e0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a2f0 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
1a300 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
1a310 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
1a320 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
1a330 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1a340 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
1a350 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
1a360 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
1a370 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
1a380 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a390 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a3a0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
1a3b0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
1a3c0 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
1a3d0 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
1a3e0 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
1a3f0 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
1a400 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
1a410 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
1a420 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
1a430 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1a440 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
1a450 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1a460 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
1a470 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a490 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
1a4a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
1a4b0 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
1a4c0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
1a4d0 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
1a4e0 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
1a4f0 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
1a500 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
1a510 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
1a520 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
1a530 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1a540 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
1a550 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1a560 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
1a570 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a580 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1a590 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
1a5a0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
1a5b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
1a5c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1a5d0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
1a5e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1a5f0 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
1a600 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
1a610 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
1a620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a630 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1a640 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a650 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
1a660 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1a670 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
1a680 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
1a690 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
1a6a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
1a6b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
1a6c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1a6e0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a6f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
1a700 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
1a710 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
1a720 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
1a730 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
1a740 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
1a750 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
1a760 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
1a770 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a780 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1a790 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a7a0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a7b0 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
1a7c0 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
1a7d0 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
1a7e0 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
1a7f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1a800 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
1a810 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
1a820 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
1a830 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
1a840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1a850 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
1a860 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
1a870 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
1a880 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1a890 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1a8a0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
1a8b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a8c0 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
1a8d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1a8e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a8f0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
1a900 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
1a910 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a920 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
1a930 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
1a940 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
1a950 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
1a960 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
1a970 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
1a980 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
1a990 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
1a9a0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1a9b0 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
1a9c0 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
1a9d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
1a9e0 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
1a9f0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
1aa00 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
1aa10 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
1aa20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1aa30 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
1aa40 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
1aa50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1aa60 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
1aa70 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
1aa80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1aa90 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
1aaa0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1aab0 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
1aac0 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
1aad0 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
1aae0 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
1aaf0 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
1ab00 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
1ab10 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62  * Or, it might b
1ab20 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
1ab30 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1ab40 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1ab50 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73   .** nPage pages
1ab60 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67  . Some operating
1ab70 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e   system implemen
1ab80 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20  tations can get 
1ab90 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20  confused if .** 
1aba0 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63  you try to trunc
1abb0 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f  ate a file to so
1abc0 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20  me size that is 
1abd0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a  larger than it .
1abe0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  ** currently is,
1abf0 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
1ac00 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61  case and write a
1ac10 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74   single zero byt
1ac20 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64  e to .** the end
1ac30 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
1ac40 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
1ac50 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1ac60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1ac70 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1ac80 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64  occurs while mod
1ac90 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61  ifying.** the da
1aca0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74  tabase file, ret
1acb0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
1acc0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
1acd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ace0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
1acf0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1ad00 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
1ad10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ad20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ad30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1ad40 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65  _ERROR );.  asse
1ad50 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1ad60 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te!=PAGER_READER
1ad70 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f   );.  .  if( isO
1ad80 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ad90 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1ada0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1adb0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1adc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1add0 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a  GER_OPEN) .  ){.
1ade0 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
1adf0 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
1ae00 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
1ae10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1ae20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ae30 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
1ae40 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
1ae50 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
1ae60 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
1ae70 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
1ae80 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
1ae90 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1aea0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
1aeb0 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
1aec0 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67   newSize = szPag
1aed0 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
1aee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aef0 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
1af00 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
1af10 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
1af20 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
1af30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1af40 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
1af50 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
1af60 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
1af70 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a   if( (currentSiz
1af80 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69  e+szPage)<=newSi
1af90 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ze ){.        ch
1afa0 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65  ar *pTmp = pPage
1afb0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1afc0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d        memset(pTm
1afd0 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20  p, 0, szPage);. 
1afe0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1aff0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1b000 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
1b010 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1b020 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1b030 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
1b040 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1b050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1b060 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1b070 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
1b080 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
1b090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b0a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b0b0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1b0c0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1b0d0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
1b0e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b0f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b100 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65  eturn a sanitize
1b110 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
1b120 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20   sector-size of 
1b130 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54  OS file pFile. T
1b140 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
1b150 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ue is guaranteed
1b160 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20   to lie between 
1b170 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f  32 and MAX_SECTO
1b180 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73  R_SIZE..*/.int s
1b190 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1b1a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1b1b0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65  File){.  int iRe
1b1c0 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  t = sqlite3OsSec
1b1d0 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a  torSize(pFile);.
1b1e0 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b    if( iRet<32 ){
1b1f0 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b  .    iRet = 512;
1b200 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65  .  }else if( iRe
1b210 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  t>MAX_SECTOR_SIZ
1b220 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
1b230 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b240 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65  >=512 );.    iRe
1b250 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  t = MAX_SECTOR_S
1b260 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
1b270 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iRet;.}../*.**
1b280 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
1b290 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
1b2a0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1b2b0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
1b2c0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
1b2d0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1b2e0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1b2f0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
1b300 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
1b310 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
1b320 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
1b330 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64  be used .** to d
1b340 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
1b350 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20  e and alignment 
1b360 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
1b370 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72  r and .** master
1b380 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1b390 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64  s within created
1b3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1b3b0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
1b3c0 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66  ary files the ef
1b3d0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b3e0 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31  ize is always 51
1b3f0 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f  2 bytes..**.** O
1b400 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f  therwise, for no
1b410 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n-temporary file
1b420 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  s, the effective
1b430 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a   sector size is.
1b440 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  ** the value ret
1b450 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
1b460 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f  ctorSize() metho
1b470 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  d rounded up to 
1b480 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  32 if.** it is l
1b490 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20  ess than 32, or 
1b4a0 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
1b4b0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1b4c0 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
1b4d0 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
1b4e0 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20  TOR_SIZE..**.** 
1b4f0 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  If the file has 
1b500 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
1b510 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1b520 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74  RITE property, t
1b530 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65  hen set.** the e
1b540 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b550 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  size to its mini
1b560 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e  mum value (512).
1b570 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
1b580 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74  .** pPager->sect
1b590 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66  orSize is to def
1b5a0 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20 72  ine the "blast r
1b5b0 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73 20  adius" of bytes 
1b5c0 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1b5d0 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68 20  ange if a crash 
1b5e0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72 69  occurs while wri
1b5f0 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65  ting to a single
1b600 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74   byte in.** that
1b610 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74   range.  But wit
1b620 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  h POWERSAFE_OVER
1b630 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74  WRITE, the blast
1b640 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a   radius is zero.
1b650 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61 74  ** (that is what
1b660 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1b670 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20  RITE means), so 
1b680 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  we minimize the 
1b690 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20  sector.** size. 
1b6a0 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63   For backwards c
1b6b0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20  ompatibility of 
1b6c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1b6d0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
1b6e0 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72  ,.** we cannot r
1b6f0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1b700 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1b710 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74  below 512..*/.st
1b720 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
1b730 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
1b740 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
1b750 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1b760 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1b770 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
1b780 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
1b790 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  ile.   || (sqlit
1b7a0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1b7b0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1b7c0 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20 20  ->fd) & .       
1b7d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1b7e0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1b7f0 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b  ERWRITE)!=0.  ){
1b800 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
1b810 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
1b820 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
1b830 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
1b840 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
1b850 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
1b860 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
1b870 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
1b880 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1b890 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
1b8a0 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70  gfault. */.    p
1b8b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1b8c0 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  e = 512;.  }else
1b8d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
1b8e0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
1b8f0 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  e3SectorSize(pPa
1b900 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a  ger->fd);.  }.}.
1b910 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
1b920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1b930 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
1b940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1b950 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
1b960 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
1b970 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
1b980 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
1b990 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1b9a0 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
1b9b0 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
1b9c0 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
1b9d0 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
1b9e0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
1b9f0 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
1ba00 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1ba10 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1ba20 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
1ba30 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
1ba40 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
1ba50 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
1ba60 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1ba70 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
1ba80 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1ba90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
1baa0 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
1bab0 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
1bac0 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
1bad0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1bae0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
1baf0 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
1bb00 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
1bb10 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
1bb20 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
1bb30 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1bb40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1bb50 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
1bb60 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
1bb70 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
1bb80 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
1bb90 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
1bba0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1bbb0 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
1bbc0 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
1bbd0 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
1bbe0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
1bbf0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
1bc00 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1bc10 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1bc20 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 73  ch is the page s
1bc30 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65  ize..**  (7)  ze
1bc40 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74  ro padding out t
1bc50 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
1bc60 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20  r size..**  (8) 
1bc70 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
1bc80 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
1bc90 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
1bca0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1bcb0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
1bcc0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
1bcd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
1bce0 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
1bcf0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1bd00 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
1bd10 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
1bd20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1bd30 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
1bd40 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20  e first 7 items 
1bd50 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
1bd60 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
1bd70 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
1bd80 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69 74  ce of the 8th it
1bd90 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
1bda0 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
1bdb0 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
1bdc0 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
1bdd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
1bde0 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
1bdf0 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
1be00 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
1be10 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
1be20 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
1be30 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
1be40 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
1be50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
1be60 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
1be70 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
1be80 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
1be90 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
1bea0 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
1beb0 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
1bec0 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
1bed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1bee0 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
1bef0 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
1bf00 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
1bf10 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
1bf20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
1bf30 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
1bf40 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
1bf50 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
1bf60 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
1bf70 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
1bf80 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
1bf90 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
1bfa0 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
1bfb0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1bfc0 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
1bfd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
1bfe0 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
1bff0 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
1c000 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
1c010 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
1c020 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1c030 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
1c040 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
1c050 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
1c060 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
1c070 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
1c080 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
1c090 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
1c0a0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
1c0b0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
1c0c0 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
1c0d0 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
1c0e0 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
1c0f0 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
1c100 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
1c110 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
1c120 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
1c130 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
1c140 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
1c150 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
1c160 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
1c170 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1c180 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
1c190 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
1c1a0 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
1c1b0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
1c1c0 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
1c1d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1c1e0 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
1c1f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
1c200 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
1c210 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1c220 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
1c230 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
1c240 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
1c250 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
1c260 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
1c270 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
1c280 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
1c290 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
1c2a0 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
1c2b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1c2c0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
1c2d0 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74  he isHot paramet
1c2e0 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  er indicates tha
1c2f0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
1c300 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f  to rollback a jo
1c310 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69  urnal.** that mi
1c320 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75  ght be a hot jou
1c330 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f  rnal.  Or, it co
1c340 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65 20  uld be that the 
1c350 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70  journal is .** p
1c360 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73 65  reserved because
1c370 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   of JOURNALMODE_
1c380 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e  PERSIST or JOURN
1c390 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e  ALMODE_TRUNCATE.
1c3a0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1c3b0 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74  al really is hot
1c3c0 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  , reset the page
1c3d0 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f  r cache prior ro
1c3e0 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e  lling.** back an
1c3f0 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74  y content.  If t
1c400 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65  he journal is me
1c410 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c  rely persistent,
1c420 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20   no reset is.** 
1c430 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
1c440 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
1c450 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1c460 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
1c470 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1c480 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1c490 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  fs;.  i64 szJ;  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4b0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
1c4c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
1c4d0 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
1c4e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c4f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1c500 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
1c510 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
1c520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c530 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1c540 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1c550 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
1c560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1c570 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
1c580 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
1c590 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5b0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
1c5c0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
1c5d0 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1c5f0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1c600 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1c610 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  () */.  char *zM
1c620 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  aster = 0;      
1c630 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74   /* Name of mast
1c640 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1c650 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
1c660 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b 20  needPagerReset; 
1c670 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1c680 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f 72  reset page prior
1c690 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 72   to first page r
1c6a0 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ollback */.  int
1c6b0 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20   nPlayback = 0; 
1c6c0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1c6d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 72  umber of pages r
1c6e0 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75  estored from jou
1c6f0 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  rnal */..  /* Fi
1c700 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1c710 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1c720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1c730 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1c740 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1c750 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1c760 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c770 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1c780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c790 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c7a0 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1c7b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c7c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1c7d0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1c7e0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1c7f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1c800 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c810 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1c820 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1c830 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1c840 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1c850 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1c860 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1c870 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1c880 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c890 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1c8a0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1c8b0 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1c8c0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1c8d0 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1c8e0 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1c8f0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1c900 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1c910 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1c920 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1c930 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1c940 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1c950 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1c960 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1c970 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1c980 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c990 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1c9a0 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1c9b0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1c9c0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1c9d0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1c9e0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1c9f0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1ca00 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1ca10 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ca20 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1ca30 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1ca40 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1ca50 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1ca60 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1ca70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ca80 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1ca90 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1caa0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1cab0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1cac0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1cad0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1cae0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1caf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cb00 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1cb10 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1cb20 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1cb30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1cb40 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1cb50 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1cb60 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1cb70 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1cb80 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1cb90 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1cba0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1cbb0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1cbc0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1cbd0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1cbe0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1cbf0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1cc00 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1cc10 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1cc20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1cc30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1cc40 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1cc50 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1cc60 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1cc70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1cc80 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1cc90 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1cca0 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1ccb0 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1ccc0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1ccd0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1cce0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1ccf0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1cd00 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1cd10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1cd20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1cd30 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1cd40 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1cd50 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1cd60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cd70 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1cd80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1cd90 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1cda0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cdb0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1cdc0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cdd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1cde0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1cdf0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1ce00 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1ce10 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1ce20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1ce30 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1ce40 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1ce50 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1ce60 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1ce70 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1ce80 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1ce90 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1cea0 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1ceb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1cec0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1ced0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1cee0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1cef0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1cf00 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1cf10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1cf20 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1cf30 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1cf40 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1cf50 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1cf60 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1cf70 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1cf80 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1cf90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1cfa0 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1cfb0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1cfc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1cfd0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1cfe0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1cff0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1d000 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1d010 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1d020 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1d030 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1d040 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1d050 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1d060 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1d070 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1d080 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1d090 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1d0a0 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1d0b0 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1d0c0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1d0d0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1d0e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1d0f0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1d100 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1d110 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1d120 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1d130 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1d140 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1d150 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1d160 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1d170 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1d180 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1d190 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1d1a0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1d1b0 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1d1c0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1d1d0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1d1e0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1d1f0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1d200 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1d210 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1d220 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1d230 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1d240 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1d250 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1d260 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1d270 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1d280 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1d290 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1d2a0 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1d2b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1d2c0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1d2d0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1d2e0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1d2f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d300 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1d310 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1d320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d330 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1d340 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1d350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1d360 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1d370 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d380 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d390 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1d3a0 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1d3b0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1d3c0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1d3d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1d3e0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1d3f0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1d400 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1d410 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1d420 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d430 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1d440 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d450 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1d460 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d480 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d490 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1d4a0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d4b0 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1d4c0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1d4d0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1d4e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1d4f0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1d500 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d510 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1d520 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1d530 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1d540 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1d550 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1d560 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1d570 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1d580 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1d590 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1d5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1d5b0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1d5c0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1d5d0 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1d5e0 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1d5f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d610 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1d620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d640 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1d650 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d660 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1d670 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d680 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d690 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1d6a0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1d6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d6c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1d6d0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1d6e0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1d6f0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1d700 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1d710 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1d720 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1d730 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1d740 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1d750 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1d760 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1d770 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1d780 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1d790 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1d7a0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1d7b0 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1d7c0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1d7d0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1d7e0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1d7f0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1d800 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1d810 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1d820 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d830 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1d840 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1d850 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d870 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1d880 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1d890 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1d8a0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1d8b0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1d8c0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1d8d0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1d8e0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1d8f0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1d900 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1d910 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1d920 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1d930 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d940 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1d950 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1d960 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1d970 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1d980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d990 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d9a0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1d9b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d9c0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1d9d0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1d9e0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1d9f0 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
1da00 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
1da10 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1da20 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
1da30 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
1da40 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
1da50 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1da60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
1da70 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
1da80 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
1da90 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
1daa0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
1dab0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
1dac0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
1dad0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1dae0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
1daf0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66  dified..  */.#if
1db00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1db10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
1db20 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1db30 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
1db40 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
1db50 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
1db60 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1db70 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ,0);.  }.#endif.
1db80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c  .  /* If this pl
1db90 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e  ayback is happen
1dba0 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ing automaticall
1dbb0 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  y as a result of
1dbc0 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20   an IO or .  ** 
1dbd0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61  malloc error tha
1dbe0 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72  t occurred after
1dbf0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1dc00 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
1dc10 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65  but .  ** before
1dc20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1dc30 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20   was committed, 
1dc40 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d  then the change-
1dc50 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f  counter .  ** mo
1dc60 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a  dification may j
1dc70 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  ust have been re
1dc80 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20  verted. If this 
1dc90 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75  happens in exclu
1dca0 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c  sive .  ** mode,
1dcb0 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74   then subsequent
1dcc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65   transactions pe
1dcd0 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63  rformed by the c
1dce0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e  onnection will n
1dcf0 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74  ot.  ** update t
1dd00 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1dd10 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d  r at all. This m
1dd20 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65  ay lead to cache
1dd30 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20   inconsistency. 
1dd40 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72   ** problems for
1dd50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1dd60 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
1dd70 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f  n the future. So
1dd80 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63  , just.  ** in c
1dd90 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70  ase this has hap
1dda0 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65  pened, clear the
1ddb0 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
1ddc0 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a   flag now..  */.
1ddd0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
1dde0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
1ddf0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
1de00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1de10 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65  OK ){.    zMaste
1de20 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1de30 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20  Space;.    rc = 
1de40 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
1de50 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
1de60 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
1de70 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1de80 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  +1);.    testcas
1de90 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1dea0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1deb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
1dec0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1ded0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1dee0 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1def0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1df00 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1df10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1df20 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ync(pPager, 0);.
1df30 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1df40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1df50 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1df60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1df70 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
1df80 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74  0', 0);.    test
1df90 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1dfa0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1dfb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dfc0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
1dfd0 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
1dfe0 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
1dff0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
1e000 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
1e010 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
1e020 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
1e030 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
1e040 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
1e050 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
1e060 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1e070 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
1e080 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1e090 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1e0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1e0b0 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26 26  }.  if( isHot &&
1e0c0 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20   nPlayback ){.  
1e0d0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1e0e0 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
1e0f0 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72  VER_ROLLBACK, "r
1e100 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67 65  ecovered %d page
1e110 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20  s from %s",.    
1e120 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61              nPla
1e130 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a  yback, pPager->z
1e140 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20  Journal);.  }.. 
1e150 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
1e160 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1e170 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
1e180 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
1e190 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
1e1a0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
1e1b0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
1e1c0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
1e1d0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
1e1e0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
1e1f0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
1e200 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
1e210 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
1e220 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
1e230 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1e240 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
1e250 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
1e260 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
1e270 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e280 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
1e290 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1e2a0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1e2b0 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1e2c0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1e2d0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1e2e0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1e2f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1e300 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1e310 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1e320 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1e330 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1e340 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1e350 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1e360 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1e370 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1e380 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1e390 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1e3a0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1e3b0 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1e3c0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1e3d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1e3e0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1e3f0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c  Page(PgHdr *pPg,
1e400 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20   u32 iFrame){.  
1e410 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e420 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
1e430 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
1e440 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1e450 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
1e460 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
1e470 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
1e480 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
1e490 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e4a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1e4b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e4c0 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20  */.  int pgsz = 
1e4d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e4e0 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ; /* Number of b
1e4f0 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
1e500 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e510 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1e520 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44  _READER && !MEMD
1e530 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
1e540 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1e550 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1e560 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1e570 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1e580 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
1e590 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1e5a0 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
1e5b0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
1e5c0 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72  sqlite3WalReadFr
1e5d0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1e5e0 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20  , iFrame, pgsz, 
1e5f0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pPg->pData);.  }
1e600 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
1e610 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1e620 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1e630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e640 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e650 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1e660 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1e670 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1e680 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e690 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1e6a0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1e6b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e6c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1e6d0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1e6e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1e6f0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1e700 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1e710 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1e720 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1e730 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1e740 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1e750 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1e760 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1e770 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1e780 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1e790 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1e7a0 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1e7b0 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1e7c0 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1e7d0 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1e7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1e7f0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1e800 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1e810 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1e820 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1e830 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1e840 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1e850 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1e860 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1e870 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1e880 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1e890 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1e8a0 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1e8b0 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1e8c0 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1e8d0 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1e8e0 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1e8f0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1e900 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1e910 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1e920 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1e930 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1e940 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e  te noise equalin
1e950 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1e960 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1e970 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1e980 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1e990 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1e9a0 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1e9b0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e9c0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1e9d0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1e9e0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1e9f0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1ea00 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1ea10 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1ea20 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1ea30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ea40 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1ea50 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1ea60 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1ea70 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1ea80 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1ea90 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1eaa0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1eab0 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  KPT);..  PAGER_I
1eac0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ead0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1eae0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1eaf0 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1eb00 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1eb10 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1eb20 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1eb30 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1eb40 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1eb50 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1eb60 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1eb70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1eb80 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1eb90 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1eba0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1ebb0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1ebc0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ebd0 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1ebe0 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1ebf0 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1ec00 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1ec10 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1ec20 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1ec30 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1ec40 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1ec50 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1ec60 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1ec70 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1ec80 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1ec90 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1eca0 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1ecb0 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1ecc0 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1ecd0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1ece0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1ecf0 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1ed00 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1ed10 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1ed20 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ed30 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1ed40 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1ed50 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1ed60 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1ed70 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1ed80 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1ed90 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1eda0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1edb0 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1edc0 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1edd0 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1ede0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1edf0 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1ee00 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1ee10 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1ee20 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1ee30 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1ee40 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1ee50 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1ee60 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1ee70 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1ee80 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1ee90 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1eea0 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1eeb0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1eec0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1eed0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1eee0 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1eef0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ef00 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1ef10 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1ef20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ef30 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1ef40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ef50 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1ef60 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1ef70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ef80 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1ef90 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1efa0 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1efb0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1efc0 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1efd0 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1efe0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1eff0 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1f000 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1f010 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1f020 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1f030 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1f040 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1f050 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1f060 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1f070 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1f080 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1f090 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1f0a0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1f0b0 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1f0c0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1f0d0 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1f0e0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1f0f0 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1f100 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1f110 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1f120 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1f130 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1f140 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1f150 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1f160 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1f170 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1f180 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1f190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f1a0 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1f1b0 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1f1c0 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1f1d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f1e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1f1f0 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1f200 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1f210 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1f220 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1f230 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1f240 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1f250 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1f260 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1f270 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1f280 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1f290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f2a0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1f2b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f2c0 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
1f2d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1f2e0 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
1f2f0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1f300 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d  Pg->pgno, &iFram
1f310 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1f320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f330 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
1f340 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72 61  DbPage(pPg, iFra
1f350 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1f360 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f380 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1f390 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  r(pPg);.      }.
1f3a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f3b0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
1f3c0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
1f3d0 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
1f3e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1f3f0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1f400 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
1f410 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
1f420 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
1f430 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
1f440 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1f450 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
1f460 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
1f470 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
1f480 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
1f490 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
1f4a0 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
1f4b0 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
1f4c0 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
1f4d0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
1f4e0 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
1f4f0 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
1f500 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
1f510 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1f520 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
1f530 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
1f540 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
1f550 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
1f560 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
1f570 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1f580 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
1f590 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
1f5a0 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
1f5b0 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
1f5c0 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
1f5d0 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
1f5e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f5f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f600 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
1f610 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f620 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
1f630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f640 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
1f650 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f660 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
1f690 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f6a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f6b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f6c0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
1f6d0 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
1f6e0 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
1f6f0 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
1f700 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
1f710 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
1f720 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
1f730 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
1f740 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
1f750 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
1f760 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
1f770 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
1f780 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
1f790 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
1f7a0 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
1f7b0 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
1f7c0 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
1f7d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f7e0 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
1f7f0 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
1f800 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1f810 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
1f820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1f830 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
1f840 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
1f850 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
1f860 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
1f870 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f880 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f890 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 6e  >pPCache);..#ifn
1f8a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f8b0 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f 2a 20  CONCURRENT.  /* 
1f8c0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43 4f  If this is an CO
1f8d0 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61 63  NCURRENT transac
1f8e0 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67 65 20  tion, then page 
1f8f0 31 20 6d 75 73 74 20 62 65 20 72 65 72 65 61 64  1 must be reread
1f900 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68 65 20   from .  ** the 
1f910 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20 69 66  db file, even if
1f920 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72 74 79   it is not dirty
1f930 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
1f940 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  e the b-tree lay
1f950 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  er .  ** may hav
1f960 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f 65 64  e already zeroed
1f970 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64 20 69   the nFree and i
1f980 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66 69 65  Trunk header fie
1f990 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  lds.  */.  if( r
1f9a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1f9b0 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69  (pList==0 || pLi
1f9c0 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26 26 20  st->pgno!=1) && 
1f9d0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64  pPager->pAllRead
1f9e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1f9f0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1fa00 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 31 29  void*)pPager, 1)
1fa10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1fa20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1fa30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fa40 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1fa50 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1fa60 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1fa70 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1fa80 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1fa90 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1faa0 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1fab0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1fac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1fad0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1fae0 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1faf0 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1fb00 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1fb10 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1fb20 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1fb30 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1fb40 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1fb50 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1fb60 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1fb70 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1fb80 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1fb90 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1fba0 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1fbb0 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1fbc0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1fbd0 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1fbe0 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1fbf0 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1fc00 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1fc10 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1fc20 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1fc30 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1fc40 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1fc50 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1fc60 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1fc70 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1fc80 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1fc90 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1fca0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1fcb0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1fcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1fcd0 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1fce0 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1fcf0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1fd00 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1fd10 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1fd20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1fd30 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1fd60 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1fd70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1fda0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ode */.  int nLi
1fdb0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1fdc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fdd0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
1fde0 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  List */.  PgHdr 
1fdf0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1fe00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1fe10 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1fe20 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ges */..  assert
1fe30 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1fe40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1fe50 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t );.#ifdef SQLI
1fe60 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
1fe70 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
1fe80 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63  ge list is in ac
1fe90 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
1fea0 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1feb0 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20  p && p->pDirty; 
1fec0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
1fee0 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70  o < p->pDirty->p
1fef0 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  gno );.  }.#endi
1ff00 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  f..  assert( pLi
1ff10 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c  st->pDirty==0 ||
1ff20 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69   isCommit );.  i
1ff30 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1ff40 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1ff50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1ff60 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1ff70 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1ff80 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1ff90 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1ffa0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1ffb0 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1ffc0 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1ffd0 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1ffe0 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1fff0 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
20000 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
20010 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
20020 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
20030 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
20040 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20  gHdr **ppNext = 
20050 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73  &pList;.    nLis
20060 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  t = 0;.    for(p
20070 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74  =pList; (*ppNext
20080 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70   = p)!=0; p=p->p
20090 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66  Dirty){.      if
200a0 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e  ( p->pgno<=nTrun
200b0 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  cate ){.        
200c0 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
200d0 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69  rty;.        nLi
200e0 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 50 41  st++;.        PA
200f0 47 45 52 54 52 41 43 45 28 28 22 54 4f 2d 57 41  GERTRACE(("TO-WA
20100 4c 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  L %d page %d has
20110 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
20140 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  , p->pgno, pager
20150 5f 70 61 67 65 68 61 73 68 28 70 29 29 29 3b 0a  _pagehash(p)));.
20160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20170 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
20180 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20190 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
201a0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
201b0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
201c0 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
201d0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
201e0 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
201f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
20200 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
20210 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
20220 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
20230 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
20240 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
20250 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
20260 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
20270 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
20280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20290 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
202a0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   ){.    for(p=pL
202b0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
202c0 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
202d0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
202e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
202f0 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
20300 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
20310 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
20320 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
20330 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
20340 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
20350 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20360 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
20370 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
20380 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
20390 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
203a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
203b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
203c0 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
203d0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
203e0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
203f0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
20400 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
20410 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
20420 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
20430 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
20440 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
20450 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
20460 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
20470 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
20480 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
20490 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
204a0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
204b0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
204c0 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
204d0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
204e0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
204f0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
20500 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
20510 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
20520 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
20530 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20550 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
20560 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
20570 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20580 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
20590 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
205a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
205b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
205c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
205d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
205e0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
205f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20600 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
20610 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
20620 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
20630 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
20640 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
20650 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
20660 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
20670 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
20680 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
20690 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
206a0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
206b0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
206c0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
206d0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
206e0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
206f0 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
20700 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
20710 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
20720 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
20730 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
20740 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
20750 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
20760 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
20770 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
20780 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
20790 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
207a0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
207b0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
207c0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
207d0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
207e0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
207f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
20800 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20820 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
20830 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
20840 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
20850 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
20860 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
20870 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
20880 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20890 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
208a0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
208b0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
208c0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
208d0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
208e0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
208f0 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
20900 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
20910 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
20920 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
20930 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
20940 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
20950 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
20960 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
20970 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
20980 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
20990 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
209a0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
209b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
209c0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
209d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
209e0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
209f0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
20a20 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
20a30 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
20a40 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
20a50 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
20a60 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
20a70 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
20a80 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
20a90 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
20aa0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
20ab0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
20ac0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
20ad0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
20ae0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
20af0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20b00 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
20b10 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
20b20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
20b30 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
20b40 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
20b50 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
20b60 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
20b70 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
20b80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20b90 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
20ba0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
20bb0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
20bc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
20bd0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
20be0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
20bf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20c00 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
20c10 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
20c20 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
20c30 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
20c40 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
20c50 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
20c60 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76  tabase is not av
20c70 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
20c80 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79  .  ** WAL sub-sy
20c90 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  stem, determine 
20ca0 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20 62  the page count b
20cb0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
20cc0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74   of.  ** the dat
20cd0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
20ce0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20cf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20d00 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74   not an.  ** int
20d10 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
20d20 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
20d30 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65 73  round up the res
20d40 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ult..  */.  if( 
20d50 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41  nPage==0 && ALWA
20d60 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  YS(isOpen(pPager
20d70 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36  ->fd)) ){.    i6
20d80 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
20d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20da0 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
20db0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
20dc0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
20dd0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
20de0 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69  ->fd, &n);.    i
20df0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20e10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   rc;.    }.    n
20e20 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
20e30 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
20e40 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
20e50 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
20e60 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
20e70 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
20e80 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
20e90 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
20ea0 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
20eb0 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
20ec0 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
20ed0 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
20ee0 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
20ef0 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
20f00 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
20f10 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
20f20 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
20f30 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
20f40 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
20f50 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
20f60 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
20f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
20f80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20f90 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
20fa0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
20fb0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
20fc0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
20fd0 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
20fe0 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
20ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21000 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
21010 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
21020 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
21030 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
21040 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
21050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21060 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
21070 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
21080 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
21090 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
210a0 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
210b0 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
210c0 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
210d0 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
210e0 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
210f0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
21100 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
21110 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
21120 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
21130 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
21140 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
21150 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
21160 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21170 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
21180 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
21190 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
211a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
211b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
211c0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
211d0 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
211e0 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
211f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
21200 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
21210 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
21220 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
21230 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
21240 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
21250 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
21260 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
21270 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
21280 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
21290 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
212a0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
212b0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
212c0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
212d0 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
212e0 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
212f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
21300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21320 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
21330 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
21340 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
21350 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
21360 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
21370 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
21380 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
213a0 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
213b0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72   exists */.    r
213c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
213d0 65 73 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  ess(.        pPa
213e0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
213f0 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f  r->zWal, SQLITE_
21400 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
21410 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a 20 20 20  isWal.    );.   
21420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
21440 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  isWal ){.       
21450 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21470 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
21480 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
21490 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
214a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
214b0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
214c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
214d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
214e0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
214f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21500 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
21510 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
21520 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
21530 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21540 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
21550 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  e( sqlite3Pcache
21560 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
21570 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
21580 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21590 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
215a0 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  Wal(pPager, 0);.
215b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
215c0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
215d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
215e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
215f0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
21600 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
21610 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
21620 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
21630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21640 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21650 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
21660 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
21670 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
21680 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
21690 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
216a0 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
216b0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
216c0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
216d0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
216e0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
216f0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
21700 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
21710 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
21720 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
21730 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
21740 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
21750 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
21760 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
21770 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
21780 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
21790 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
217a0 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
217b0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
217c0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
217d0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
217e0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
217f0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
21800 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
21810 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
21820 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
21830 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21840 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
21850 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
21860 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
21870 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
21880 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
21890 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
218a0 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
218b0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
218c0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
218d0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
218e0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
218f0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
21900 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
21910 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
21920 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
21930 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
21940 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
21950 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
21960 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
21970 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
21980 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
21990 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
219a0 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
219b0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
219c0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
219d0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
219e0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
219f0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
21a00 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
21a10 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
21a20 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
21a30 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
21a40 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
21a50 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
21a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
21a70 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
21a80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
21a90 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
21aa0 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
21ab0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
21ac0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
21ad0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
21ae0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
21af0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
21b00 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
21b10 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
21b20 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
21b30 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
21b40 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
21b50 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
21b60 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
21b70 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
21b80 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
21b90 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
21ba0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
21bb0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
21bc0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
21bd0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
21be0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
21bf0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
21c00 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
21c10 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
21c20 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
21c30 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
21c40 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
21c50 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
21c60 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
21c70 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
21c80 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
21c90 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
21ca0 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
21cb0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
21cc0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
21cd0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
21ce0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
21cf0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
21d00 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
21d10 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
21d20 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
21d30 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
21d40 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
21d50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
21d60 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
21d70 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
21d80 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
21d90 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
21da0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21db0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
21dc0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
21dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
21de0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
21df0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
21e00 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
21e10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21e20 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
21e30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
21e40 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
21e50 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
21e60 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
21e70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
21e80 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
21e90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
21ea0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
21eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21ec0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
21ed0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
21ee0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
21ef0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
21f00 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
21f10 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
21f20 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
21f30 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
21f40 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
21f50 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
21f60 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
21f70 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
21f80 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
21f90 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
21fa0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
21fb0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
21fc0 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
21fd0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
21fe0 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
21ff0 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
22000 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
22010 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
22020 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
22030 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
22040 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
22050 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
22060 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
22070 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
22080 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
22090 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
220a0 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
220b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
220c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
220d0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
220e0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
220f0 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
22100 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
22110 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
22120 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
22130 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
22140 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
22150 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
22160 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
22170 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
22180 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
22190 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
221a0 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
221b0 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
221c0 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
221d0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
221e0 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
221f0 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
22200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
22210 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
22220 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
22230 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
22240 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
22250 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
22260 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
22270 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
22280 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
22290 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
222a0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
222b0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
222c0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
222d0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
222e0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
222f0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
22300 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
22310 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
22320 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
22330 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
22340 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
22350 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
22360 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
22370 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
22380 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
22390 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
223a0 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
223b0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
223c0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
223d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
223e0 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
223f0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
22400 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
22410 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
22420 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
22430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22440 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
22450 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
22460 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
22470 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22480 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
22490 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
224a0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
224b0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
224c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
224d0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
224e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
224f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
22500 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
22510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22520 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
22530 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
22540 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
22550 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
22560 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
22570 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
22580 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
22590 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
225a0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
225b0 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
225c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
225d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
225e0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
225f0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
22600 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
22610 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
22620 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
22630 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
22640 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
22650 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
22660 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
22670 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
22680 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22690 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
226a0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
226b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
226c0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
226d0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
226e0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
226f0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
22700 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
22710 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
22720 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22730 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
22740 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
22750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22760 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
22770 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
22780 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
22790 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
227a0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
227b0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
227c0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
227d0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
227e0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
227f0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
22800 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
22810 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
22820 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
22830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
22840 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
22850 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
22860 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
22870 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
22880 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
22890 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
228a0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
228b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
228c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
228d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
228e0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
228f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
22900 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
22910 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
22920 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
22930 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
22940 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
22950 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
22960 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22970 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22980 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
22990 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
229a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
229b0 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
229c0 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
229d0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
229e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
229f0 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
22a00 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
22a10 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
22a20 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
22a30 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
22a40 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
22a50 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
22a60 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
22a70 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
22a80 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
22a90 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
22aa0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
22ab0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22ac0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
22ad0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
22ae0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
22af0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
22b00 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
22b10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
22b20 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
22b30 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
22b40 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
22b50 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
22b60 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
22b70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
22b80 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
22b90 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
22ba0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
22bb0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
22bc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22bd0 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
22be0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
22bf0 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
22c00 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
22c10 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
22c20 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
22c30 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
22c40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
22c50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22c60 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
22c70 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
22c80 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
22ca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22cb0 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
22cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22cd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22ce0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
22cf0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
22d00 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
22d10 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
22d20 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65  pting to recycle
22d30 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65   clean and unuse
22d40 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  d pages..*/.void
22d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22d60 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
22d70 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
22d80 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
22d90 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
22da0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22db0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
22dc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22dd0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
22de0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
22df0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
22e00 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
22e10 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c  empting to spill
22e20 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61   pages to journa
22e30 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
22e40 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
22e50 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
22e60 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
22e70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
22e80 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a  cacheSetSpillsiz
22e90 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
22ea0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
22eb0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
22ec0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
22ed0 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
22ee0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
22ef0 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
22f00 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
22f10 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
22f20 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
22f30 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
22f40 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
22f50 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
22f60 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
22f70 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
22f80 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
22f90 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
22fa0 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
22fb0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
22fc0 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
22fd0 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
22fe0 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65 74 74  >0);.    setGett
22ff0 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
23000 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23010 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
23020 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23030 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
23040 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e  E, &sz);.  }.#en
23050 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  dif.}../*.** Cha
23060 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
23070 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
23080 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
23090 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
230a0 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
230b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
230c0 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
230d0 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
230e0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70  t64 szMmap){.  p
230f0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
23100 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  szMmap;.  pagerF
23110 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
23120 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
23130 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
23140 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
23150 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
23160 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23170 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
23180 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
23190 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
231a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
231b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
231c0 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20  settings of the 
231d0 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73  pager to those s
231e0 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
231f0 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65  pgFlags paramete
23200 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65  r..**.** The "le
23210 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20  vel" in pgFlags 
23220 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
23230 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68  OUS_MASK sets th
23240 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20  e robustness.** 
23250 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23260 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
23270 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20 70   OS crashes or p
23280 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
23290 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65  .** changing the
232a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
232b0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
232c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   the journals..*
232d0 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f 75 72  * There are four
232e0 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
232f0 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
23300 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
23310 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
23320 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
23330 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
23340 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
23350 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
23360 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
23370 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
23380 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
23390 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
233a0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
233b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
233c0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
233d0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
233e0 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
233f0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
23400 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
23410 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
23420 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
23430 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
23440 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
23450 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
23460 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
23470 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
23480 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23490 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
234a0 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
234b0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
234c0 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
234d0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
234e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
234f0 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
23500 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
23510 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
23520 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
23530 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
23540 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
23550 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
23560 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
23570 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
23580 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
23590 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
235a0 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
235b0 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
235c0 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
235d0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
235e0 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
235f0 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
23600 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23610 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
23620 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
23630 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
23640 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
23650 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
23660 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
23670 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
23680 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
236a0 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
236b0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
236c0 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
236d0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lback..**.**    
236e0 45 58 54 52 41 20 20 20 20 20 54 68 69 73 20 69  EXTRA     This i
236f0 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65  s like FULL exce
23700 70 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20  pt that is also 
23710 73 79 6e 63 73 20 74 68 65 20 64 69 72 65 63 74  syncs the direct
23720 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ory.**          
23730 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e      that contain
23740 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  s the rollback j
23750 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65  ournal after the
23760 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20   rollback.**    
23770 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61            journa
23780 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a  l is unlinked..*
23790 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
237a0 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b  s for a rollback
237b0 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20  -journal mode.  
237c0 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46  For WAL mode, OF
237d0 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74  F continues.** t
237e0 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73  o mean that no s
237f0 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e  yncs ever occur.
23800 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74    NORMAL means t
23810 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73  hat the WAL is s
23820 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  ynced.** prior t
23830 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  o the start of c
23840 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68  heckpoint and th
23850 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
23860 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a  file is synced.*
23870 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
23880 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b  ion of the check
23890 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74  point if the ent
238a0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ire content of t
238b0 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72  he WAL.** was wr
238c0 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
238d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
238e0 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61  ut no sync opera
238f0 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a  tions occur for.
23900 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63  ** an ordinary c
23910 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20  ommit in NORMAL 
23920 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20  mode with WAL.  
23930 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  FULL means that 
23940 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20  the WAL.** file 
23950 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  is synced follow
23960 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20  ing each commit 
23970 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64  operation, in ad
23980 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a  dition to the.**
23990 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65   syncs associate
239a0 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20  d with NORMAL.  
239b0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
239c0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46  erence between F
239d0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41  ULL.** and EXTRA
239e0 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a   for WAL mode..*
239f0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66  *.** Do not conf
23a00 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  use synchronous=
23a10 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45  FULL with SQLITE
23a20 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65  _SYNC_FULL.  The
23a30 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  .** SQLITE_SYNC_
23a40 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73  FULL macro means
23a50 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f   to use the MacO
23a60 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73  SX-style full-fs
23a70 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e  ync.** using fcn
23a80 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e  tl(F_FULLFSYNC).
23a90 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f    SQLITE_SYNC_NO
23aa0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f  RMAL means to do
23ab0 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20   an.** ordinary 
23ac0 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54  fsync() call.  T
23ad0 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65  here is no diffe
23ae0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51  rence between SQ
23af0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a  LITE_SYNC_FULL.*
23b00 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e  * and SQLITE_SYN
23b10 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74  C_NORMAL on plat
23b20 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e  forms other than
23b30 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68   MacOSX.  But th
23b40 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  e.** synchronous
23b50 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e  =FULL versus syn
23b60 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
23b70 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e  setting determin
23b80 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78  es when.** the x
23b90 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69  Sync primitive i
23ba0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20  s called and is 
23bb0 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20  relevant to all 
23bc0 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a  platforms..**.**
23bd0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
23be0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23bf0 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
23c00 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
23c10 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
23c20 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
23c30 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
23c40 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
23c50 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
23c60 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
23c70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
23c80 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73 61   pager to set sa
23c90 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a  fety level for *
23ca0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
23cb0 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72  lags      /* Var
23cc0 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ious flags */.){
23cd0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65  .  unsigned leve
23ce0 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41  l = pgFlags & PA
23cf0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
23d00 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  MASK;.  if( pPag
23d10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
23d20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
23d30 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  nc = 1;.    pPag
23d40 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30  er->fullSync = 0
23d50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
23d60 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  traSync = 0;.  }
23d70 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23d80 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
23d90 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23da0 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20  NOUS_OFF ?1:0;. 
23db0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
23dc0 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47  ync = level>=PAG
23dd0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46  ER_SYNCHRONOUS_F
23de0 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50  ULL ?1:0;.    pP
23df0 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
23e00 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53  = level==PAGER_S
23e10 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41  YNCHRONOUS_EXTRA
23e20 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28   ?1:0;.  }.  if(
23e30 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
23e40 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23e50 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  yncFlags = 0;.  
23e60 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23e70 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d  ncFlags = 0;.  }
23e80 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73  else if( pgFlags
23e90 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59   & PAGER_FULLFSY
23ea0 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
23eb0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23ec0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
23ed0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
23ee0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
23ef0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
23f00 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67  }else if( pgFlag
23f10 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46  s & PAGER_CKPT_F
23f20 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
23f30 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23f40 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23f50 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
23f60 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
23f70 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
23f80 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  FULL;.  }else{. 
23f90 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23fa0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23fb0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
23fc0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
23fd0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
23fe0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  NC_NORMAL;.  }. 
23ff0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
24000 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
24010 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
24020 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
24030 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
24040 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d  >walSyncFlags |=
24050 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
24060 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66  CTIONS;.  }.  if
24070 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  ( pgFlags & PAGE
24080 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a  R_CACHESPILL ){.
24090 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
240a0 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
240b0 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  FLAG_OFF;.  }els
240c0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  e{.    pPager->d
240d0 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49  oNotSpill |= SPI
240e0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a  LLFLAG_OFF;.  }.
240f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
24100 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
24110 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
24120 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
24130 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
24140 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
24150 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
24160 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
24170 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
24180 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
24190 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
241a0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
241b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
241c0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
241d0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
241e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
241f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
24200 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
24210 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
24220 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
24230 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
24240 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
24250 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
24260 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
24270 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
24280 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
24290 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
242a0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
242b0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
242c0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
242d0 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
242e0 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
242f0 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
24300 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
24310 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
24320 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
24330 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
24340 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
24350 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
24360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
24370 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
24380 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
24390 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
243a0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
243b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
243c0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
243d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
243e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
243f0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
24400 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
24410 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
24420 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
24430 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
24440 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
24450 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
24460 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
24470 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
24480 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24490 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
244a0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
244b0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
244c0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
244d0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
244e0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
244f0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
24500 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
24510 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
24520 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
24530 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
24540 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
24550 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
24560 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
24570 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
24580 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24590 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
245a0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
245b0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
245c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
245d0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
245e0 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
245f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
24600 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
24610 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
24620 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
24630 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
24640 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
24650 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
24660 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
24670 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
24680 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
24690 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
246a0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
246b0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
246c0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
246d0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
246e0 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
246f0 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
24700 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
24710 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
24720 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
24730 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
24740 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
24750 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
24760 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
24770 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
24780 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
24790 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
247a0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
247b0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
247c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247d0 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
247e0 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
247f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24820 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
24830 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
24840 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
24850 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
24860 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
24870 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
24880 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
24890 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
248a0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
248b0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
248c0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
248d0 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
248e0 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
248f0 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
24900 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
24910 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
24920 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
24930 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
24940 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
24950 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
24960 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
24970 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
24980 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
24990 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
249a0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
249b0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
249c0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
249d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
249e0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
249f0 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
24a00 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
24a10 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
24a20 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
24a30 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
24a40 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
24a50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
24a60 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
24a70 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
24a80 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  dler */.){.  pPa
24a90 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24aa0 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
24ab0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
24ac0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
24ad0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a  usyHandlerArg;..
24ae0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24af0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24b00 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69  void **ap = (voi
24b10 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42  d **)&pPager->xB
24b20 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
24b30 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29  assert( ((int(*)
24b40 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29  (void *))(ap[0])
24b50 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20  )==xBusyHandler 
24b60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
24b70 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c  p[1]==pBusyHandl
24b80 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c  erArg );.    sql
24b90 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
24ba0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
24bb0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42  , SQLITE_FCNTL_B
24bc0 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69  USYHANDLER, (voi
24bd0 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  d *)ap);.  }.}..
24be0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
24bf0 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
24c00 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
24c10 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
24c20 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
24c30 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
24c40 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
24c50 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
24c60 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
24c70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24c80 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
24c90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
24ca0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
24cb0 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
24cc0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
24cd0 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
24ce0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20  QLITE_IOERR, an 
24cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78  SQLITE_IOERR_xxx
24d00 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c   sub-code or SQL
24d10 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
24d20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
24d30 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
24d40 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
24d50 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
24d60 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
24d70 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
24d80 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
24d90 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
24da0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
24db0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
24dc0 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
24dd0 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
24de0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
24df0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
24e00 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
24e10 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
24e20 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
24e30 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
24e40 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
24e50 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
24e60 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
24e70 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
24e80 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
24e90 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
24ea0 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
24eb0 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
24ec0 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
24ed0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24ee0 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
24ef0 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
24f00 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
24f10 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
24f20 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
24f30 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
24f40 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
24f50 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
24f60 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
24f70 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
24f80 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
24f90 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
24fa0 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
24fb0 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
24fc0 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
24fd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24fe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
24ff0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
25000 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
25010 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
25020 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
25030 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
25040 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
25050 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
25060 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
25070 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
25080 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
25090 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
250a0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
250b0 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
250c0 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
250d0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
250e0 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
250f0 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
25100 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
25110 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
25120 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
25130 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50  *pPager, u32 *pP
25140 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
25150 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
25160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
25170 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
25180 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66  ssible to do a f
25190 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72  ull assert_pager
251a0 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20 61  _state() here, a
251b0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
251c0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
251d0 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50  ed from within P
251e0 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f  agerOpen(), befo
251f0 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a  re the state.  *
25200 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  * of the Pager o
25210 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61  bject is interna
25220 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a  lly consistent..
25230 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65    **.  ** At one
25240 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63   point this func
25250 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e  tion returned an
25260 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70 61   error if the pa
25270 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a  ger was in .  **
25280 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
25290 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41  te. But since PA
252a0 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20  GER_ERROR state 
252b0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
252c0 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74    ** there is at
252d0 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
252e0 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
252f0 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63  rence, this func
25300 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e  tion.  ** is a n
25310 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61  o-op for that ca
25320 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a  se anyhow..  */.
25330 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 20  .  u32 pageSize 
25340 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
25350 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
25360 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
25370 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
25380 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
25390 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
253a0 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( (pPager->memDb
253b0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
253c0 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20  bSize==0).   && 
253d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
253e0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
253f0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26  Cache)==0 .   &&
25400 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
25410 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67  eSize!=(u32)pPag
25420 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
25430 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65  ){.    char *pNe
25440 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  w = NULL;       
25450 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d        /* New tem
25460 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  p space */.    i
25470 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20  64 nByte = 0;.. 
25480 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
25490 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
254a0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
254b0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
254c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
254d0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
254e0 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
254f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
25500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25510 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29   pNew = (char *)
25520 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
25530 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
25540 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
25550 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
25560 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
25570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
25590 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
255a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
255b0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
255c0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
255d0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
255e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
255f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
25610 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
25620 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
25630 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
25640 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
25650 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25660 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b  = (Pgno)((nByte+
25670 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65  pageSize-1)/page
25680 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
25690 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
256a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65  pageSize;.    }e
256b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
256c0 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29  e3PageFree(pNew)
256d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
256e0 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
256f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
25700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25710 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
25720 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
25730 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
25740 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
25750 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
25760 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
25770 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
25780 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
25790 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
257a0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
257b0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
257c0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
257d0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
257e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
257f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
25800 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
25810 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
25820 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
25830 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
25840 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
25850 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
25860 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
25870 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
25880 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
25890 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
258a0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
258b0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
258c0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
258d0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
258e0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
258f0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
25900 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
25910 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
25920 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
25930 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
25940 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
25950 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
25960 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
25970 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
25980 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
25990 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
259a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
259b0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
259c0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
259d0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
259e0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
259f0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
25a00 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
25a10 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
25a20 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
25a30 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
25a40 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
25a50 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
25a60 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
25a70 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
25a80 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
25a90 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
25aa0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
25ab0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
25ac0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
25ad0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
25ae0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
25af0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
25b00 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
25b10 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
25b20 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
25b30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25b40 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
25b50 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
25b60 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
25b70 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
25b80 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
25b90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
25ba0 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
25bb0 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
25bc0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
25bd0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
25be0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
25bf0 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
25c00 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
25c10 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
25c20 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
25c30 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
25c40 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25c50 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
25c60 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
25c70 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
25c80 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
25c90 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
25ca0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
25cb0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
25cc0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
25cd0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
25ce0 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
25cf0 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
25d00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
25d10 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
25d20 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25d30 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
25d40 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
25d50 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
25d60 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
25d70 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
25d80 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25d90 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
25da0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
25db0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
25dc0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
25dd0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
25de0 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
25df0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
25e00 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
25e10 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25e20 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
25e30 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
25e40 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
25e50 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
25e60 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
25e70 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25e80 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
25e90 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
25ea0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
25eb0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
25ec0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
25ed0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
25ee0 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
25ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
25f00 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
25f10 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
25f20 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
25f30 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
25f40 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
25f50 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
25f60 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
25f70 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
25f80 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
25f90 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
25fa0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
25fb0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
25fc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
25fd0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
25fe0 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
25ff0 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
26000 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
26010 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
26020 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
26030 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
26040 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
26050 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
26060 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
26070 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
26080 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
26090 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
260a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
260b0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
260c0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
260d0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
260e0 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
260f0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
26100 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
26110 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
26120 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
26130 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
26140 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
26150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
26160 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
26170 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
26180 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
26190 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
261a0 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
261b0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
261c0 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
261d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
261e0 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
261f0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
26200 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
26210 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
26220 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
26230 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
26240 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
26250 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
26260 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
26270 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
26280 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
26290 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
262a0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
262b0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
262c0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
262d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
262e0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
262f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
26300 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
26310 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26320 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
26330 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26340 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26350 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
26360 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
26370 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
26380 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
26390 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
263a0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
263b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
263c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
263d0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
263e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
263f0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
26400 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
26410 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
26420 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
26430 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
26440 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26450 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
26460 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
26470 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
26480 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
26490 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
264a0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
264b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
264c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
264d0 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
264e0 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
264f0 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
26500 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
26510 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
26520 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
26530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26540 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
26550 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
26560 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
26570 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26580 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
26590 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
265a0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
265b0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
265c0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
265d0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
265e0 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
265f0 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
26600 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
26610 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
26620 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
26630 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
26640 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
26650 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
26660 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
26670 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
26680 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
26690 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
266a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
266b0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
266c0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
266d0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
266e0 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
266f0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
26700 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
26710 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
26720 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
26730 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
26740 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
26750 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
26760 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
26770 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
26780 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
26790 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
267a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
267c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
267d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
267e0 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
267f0 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
26800 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
26810 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
26820 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20  ready held), or 
26830 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
26840 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  itions that the 
26850 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
26860 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
26870 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
26880 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
26890 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
268a0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
268b0 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
268c0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
268d0 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
268e0 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
268f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
26900 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
26910 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
26920 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
26930 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
26940 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
26950 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
26960 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
26970 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
26980 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
26990 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
269a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
269b0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
269c0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
269d0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
269e0 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
269f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
26a00 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
26a10 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
26a20 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
26a30 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
26a40 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
26a50 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
26a60 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
26a70 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
26a80 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
26a90 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
26aa0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
26ab0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
26ac0 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
26ad0 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
26ae0 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
26af0 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
26b00 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
26b10 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
26b20 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
26b30 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
26b40 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
26b50 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
26b60 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
26b70 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
26b80 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
26b90 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
26ba0 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
26bb0 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
26bc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
26bd0 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
26be0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
26bf0 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
26c00 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
26c10 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
26c20 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
26c30 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
26c40 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
26c50 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
26c60 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
26c70 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
26c80 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
26c90 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
26ca0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
26cb0 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
26cc0 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
26cd0 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
26ce0 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
26cf0 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
26d00 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
26d10 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
26d20 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
26d30 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
26d40 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
26d50 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
26d60 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
26d70 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
26d80 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
26d90 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
26da0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
26db0 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
26dc0 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
26dd0 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
26de0 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
26df0 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
26e00 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
26e10 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
26e20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
26e30 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
26e40 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
26e50 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
26e60 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
26e70 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
26e80 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26e90 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26ea0 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
26eb0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
26ec0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
26ed0 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
26ee0 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
26ef0 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
26f00 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
26f10 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
26f20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26f30 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26f40 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
26f50 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
26f60 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
26f70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
26f80 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
26f90 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
26fa0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
26fb0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26fc0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
26fd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
26fe0 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
26ff0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
27000 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
27010 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
27020 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
27030 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
27040 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
27050 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
27060 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
27070 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
27080 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
27090 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
270a0 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
270b0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
270c0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
270d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
270e0 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
270f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
27100 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
27110 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
27120 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
27130 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
27140 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
27150 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
27160 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
27170 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
27180 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
27190 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
271a0 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
271b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
271c0 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
271d0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
271e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
271f0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
27200 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
27210 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
27220 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
27230 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
27240 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
27250 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27260 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
27270 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
27280 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
27290 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
272a0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
272b0 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
272c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
272d0 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
272e0 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
272f0 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
27300 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
27310 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
27320 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
27330 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
27340 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
27350 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
27360 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
27370 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
27380 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
27390 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
273a0 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
273b0 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
273c0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
273d0 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
273e0 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
273f0 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
27400 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
27410 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
27420 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
27430 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
27440 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
27450 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
27460 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
27470 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
27480 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
27490 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
274a0 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
274b0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
274c0 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
274d0 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
274e0 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
274f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27500 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
27510 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
27520 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
27530 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
27540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
27550 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
27560 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27570 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
27580 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
27590 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
275a0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
275b0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
275c0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
275d0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
275e0 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
275f0 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
27600 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
27610 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
27620 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
27630 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
27640 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
27650 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
27660 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
27670 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
27680 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
27690 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
276a0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
276b0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
276c0 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
276d0 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
276e0 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
276f0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
27700 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
27710 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27720 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
27730 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
27740 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
27750 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
27760 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
27770 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27780 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27790 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
277a0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
277b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
277c0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
277d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
277e0 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
277f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27800 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27810 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
27820 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
27830 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
27840 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
27850 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
27860 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
27870 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
27880 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
27890 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
278a0 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
278b0 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
278c0 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
278d0 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e  ill use the poin
278e0 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69  ter pData, obtai
278f0 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28  ned from xFetch(
27900 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  )..** If success
27910 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65  ful, set *ppPage
27920 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
27930 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72 65   new page refere
27940 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  nce.** and retur
27950 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  n SQLITE_OK. Oth
27960 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
27970 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
27980 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a  ode and set.** *
27990 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  ppPage to zero..
279a0 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72  **.** Page refer
279b0 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62  ences obtained b
279c0 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  y calling this f
279d0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
279e0 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79  e released.** by
279f0 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65   calling pagerRe
27a00 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a  leaseMapPage()..
27a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
27a20 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
27a30 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
27a40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
27a50 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
27a60 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ject */.  Pgno p
27a70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
27a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
27a90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f  e number */.  vo
27aa0 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20  id *pData,      
27ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27ac0 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74 61   xFetch()'d data
27ad0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
27ae0 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61  /.  PgHdr **ppPa
27af0 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ge              
27b00 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75      /* OUT: Acqu
27b10 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  ired page object
27b20 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
27b30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
27b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
27b50 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
27b60 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20  o return */.  . 
27b70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d   if( pPager->pMm
27b80 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  apFreelist ){.  
27b90 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20    *ppPage = p = 
27ba0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27bb0 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65  elist;.    pPage
27bc0 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27bd0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
27be0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
27bf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27c00 67 65 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29  ger->nExtra>=8 )
27c10 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
27c20 70 45 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20  pExtra, 0, 8);. 
27c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
27c40 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
27c50 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
27c60 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
27c70 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
27c80 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
27c90 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27ca0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
27cb0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
27cc0 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
27cd0 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
27ce0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
27cf0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
27d00 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  T;.    }.    p->
27d10 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
27d20 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
27d30 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
27d40 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
27d50 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
27d60 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
27d70 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
27d80 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
27d90 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
27da0 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
27db0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
27dc0 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
27dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
27de0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
27df0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
27e00 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
27e10 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d  gno = pgno;.  p-
27e20 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  >pData = pData;.
27e30 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
27e40 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ut++;..  return 
27e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
27e60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
27e70 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  se a reference t
27e80 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20  o page pPg. pPg 
27e90 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  must have been r
27ea0 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a  eturned by an .*
27eb0 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  * earlier call t
27ec0 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  o pagerAcquireMa
27ed0 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
27ee0 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c  ic void pagerRel
27ef0 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48 64  easeMapPage(PgHd
27f00 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
27f10 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
27f20 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72  pPager;.  pPager
27f30 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20  ->nMmapOut--;.  
27f40 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  pPg->pDirty = pP
27f50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27f60 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ist;.  pPager->p
27f70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
27f80 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
27f90 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
27fa0 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
27fb0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55   );.  sqlite3OsU
27fc0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27fd0 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67  d, (i64)(pPg->pg
27fe0 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61  no-1)*pPager->pa
27ff0 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61  geSize, pPg->pDa
28000 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ta);.}../*.** Fr
28010 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a  ee all PgHdr obj
28020 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ects stored in t
28030 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72  he Pager.pMmapFr
28040 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a  eelist list..*/.
28050 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
28060 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61 67  rFreeMapHdrs(Pag
28070 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
28080 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72  gHdr *p;.  PgHdr
28090 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70   *pNext;.  for(p
280a0 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72  =pPager->pMmapFr
280b0 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65  eelist; p; p=pNe
280c0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
280d0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
280e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
280f0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  .  }.}.../*.** S
28100 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
28110 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
28120 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
28130 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
28140 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
28150 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
28160 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
28170 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
28180 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
28190 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
281a0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
281b0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
281c0 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
281d0 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
281e0 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
281f0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
28200 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
28210 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
28220 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
28230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
28240 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
28250 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
28260 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
28270 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
28280 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
28290 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
282a0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
282b0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
282c0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
282d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
282e0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
282f0 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
28300 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
28310 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
28320 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
28330 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
28340 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
28350 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
28360 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
28370 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74  r *pPager, sqlit
28380 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a 70  e3 *db){.  u8 *p
28390 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
283a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
283b0 20 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20    assert( db || 
283c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
283d0 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
283e0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
283f0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28400 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ;.  disable_simu
28410 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
28420 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
28430 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
28440 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  .  pagerFreeMapH
28450 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  drs(pPager);.  /
28460 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  * pPager->errCod
28470 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
28480 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
28490 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
284a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
284b0 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70   assert( db || p
284c0 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29  Pager->pWal==0 )
284d0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c  ;.  sqlite3WalCl
284e0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ose(pPager->pWal
284f0 2c 20 64 62 2c 20 70 50 61 67 65 72 2d 3e 63 6b  , db, pPager->ck
28500 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61  ptSyncFlags, pPa
28510 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
28520 20 20 20 20 20 28 64 62 20 26 26 20 28 64 62 2d       (db && (db-
28530 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
28540 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 3f  NoCkptOnClose) ?
28550 20 30 20 3a 20 70 54 6d 70 29 0a 20 20 29 3b 0a   0 : pTmp).  );.
28560 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
28570 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
28580 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
28590 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
285a0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
285b0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
285c0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
285d0 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
285e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
285f0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
28600 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28610 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
28620 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
28630 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
28640 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
28650 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
28660 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
28670 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
28680 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
28690 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
286a0 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
286b0 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
286c0 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
286d0 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
286e0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
286f0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
28700 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
28710 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
28720 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
28730 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
28740 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
28750 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
28760 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
28770 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
28780 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
28790 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
287a0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
287b0 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
287c0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
287d0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
287e0 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
287f0 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
28800 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
28810 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
28820 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
28830 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
28840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28850 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
28860 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
28870 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
28880 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
28890 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
288a0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
288b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
288c0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
288d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
288e0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
288f0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
28900 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
28910 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
28920 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
28930 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28940 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
28950 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
28960 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
28970 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
28980 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
28990 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
289a0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
289b0 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
289c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
289d0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
289e0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
289f0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
28a00 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
28a10 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
28a20 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
28a30 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
28a40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
28a50 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
28a60 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
28a70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
28a80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
28a90 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28aa0 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
28ab0 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
28ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
28ad0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
28ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
28af0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
28b00 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
28b10 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
28b20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
28b30 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
28b40 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
28b50 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
28b60 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
28b70 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
28b80 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
28b90 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
28ba0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
28bb0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
28bc0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28bd0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
28be0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
28bf0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
28c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
28c10 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
28c20 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
28c30 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
28c40 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
28c50 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
28c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
28c70 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
28c80 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
28c90 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
28ca0 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
28cb0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
28cc0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
28cd0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
28ce0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
28cf0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
28d00 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
28d10 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
28d20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
28d30 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
28d40 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
28d50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
28d60 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
28d70 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
28d80 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
28d90 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
28da0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
28db0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
28dc0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
28dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
28de0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
28df0 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
28e00 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
28e10 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
28e20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
28e30 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
28e40 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
28e50 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
28e60 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
28e70 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
28e80 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
28e90 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
28ea0 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
28eb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
28ec0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
28ed0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
28ee0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
28ef0 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
28f00 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
28f10 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
28f20 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
28f30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
28f40 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
28f50 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
28f60 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
28f70 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
28f80 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
28f90 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
28fa0 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
28fb0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
28fc0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
28fd0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
28fe0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
28ff0 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
29000 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
29010 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
29020 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
29030 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
29040 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
29050 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
29060 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
29070 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
29080 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
29090 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
290a0 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
290b0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
290c0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
290d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
290e0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
290f0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
29100 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
29110 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
29120 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
29130 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
29140 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
29150 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
29160 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
29170 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
29180 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
29190 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
291a0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
291b0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
291c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
291d0 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
291e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29200 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
29210 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29220 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29230 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
29240 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
29250 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29260 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
29270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
29280 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
29290 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
292a0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
292b0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
292c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
292d0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
292e0 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
292f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29300 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
29310 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
29320 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
29330 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
29340 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
29350 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29360 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
29370 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
29380 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
29390 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
293a0 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
293b0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
293c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
293d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
293e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
293f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
29400 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
29410 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
29420 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
29430 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
29440 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
29450 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
29460 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
29470 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
29480 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
29490 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
294a0 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
294b0 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
294c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
294d0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
294e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
294f0 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
29500 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
29510 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
29520 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
29530 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
29540 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
29550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
29560 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
29570 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
29580 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
29590 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
295a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
295b0 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
295c0 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
295d0 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
295e0 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
295f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
29600 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
29610 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
29620 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
29630 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
29640 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
29650 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
29660 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
29670 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
29680 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
29690 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
296a0 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
296b0 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
296c0 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
296d0 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
296e0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
296f0 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
29700 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
29710 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
29720 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
29730 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
29740 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
29750 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
29760 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
29770 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
29780 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
29790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
297a0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
297b0 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
297c0 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
297d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
297e0 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
297f0 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
29800 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
29810 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
29820 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
29830 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
29840 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
29850 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
29860 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
29870 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
29880 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
29890 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
298a0 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
298b0 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
298c0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
298d0 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
298e0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
298f0 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
29900 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
29910 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
29920 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
29930 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
29940 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
29950 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
29960 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
29970 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
29980 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
29990 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
299a0 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
299b0 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
299c0 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
299d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
299e0 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
299f0 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
29a00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
29a10 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
29a20 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
29a30 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
29a40 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
29a50 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
29a60 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
29a70 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
29a80 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
29a90 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
29aa0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
29ab0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
29ac0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
29ad0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
29ae0 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
29af0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
29b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29b10 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
29b20 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
29b30 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
29b40 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
29b50 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
29b60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
29b70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
29b80 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
29b90 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
29ba0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
29bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29bd0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
29be0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
29bf0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
29c00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29c10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
29c20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
29c30 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
29c40 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
29c50 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
29c60 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
29c70 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
29c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
29c90 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
29ca0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
29cb0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
29cc0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
29cd0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
29ce0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
29cf0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
29d00 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
29d10 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
29d20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29d30 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
29d40 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
29d50 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
29d60 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
29d70 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
29d80 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
29d90 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
29da0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
29db0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
29dc0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
29dd0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
29de0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
29df0 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
29e00 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
29e10 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
29e20 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
29e30 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
29e40 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
29e50 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
29e60 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
29e70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29e80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
29e90 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
29ea0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
29eb0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
29ec0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
29ed0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
29ee0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
29ef0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29f00 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
29f10 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
29f20 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
29f30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29f40 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
29f50 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
29f60 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
29f70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29f80 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29f90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29fa0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
29fb0 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
29fc0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
29fd0 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
29fe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29ff0 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
2a000 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
2a010 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
2a020 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
2a030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
2a040 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a060 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2a070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a080 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
2a090 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
2a0a0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
2a0b0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
2a0c0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
2a0d0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2a0e0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
2a0f0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
2a100 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
2a110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a120 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2a130 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
2a140 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
2a150 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
2a160 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
2a170 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
2a180 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
2a190 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2a1a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a1b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2a1c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2a1d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2a1e0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
2a1f0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2a200 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
2a210 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
2a220 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
2a230 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
2a240 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
2a250 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
2a260 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
2a270 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2a280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a2a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2a2b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2a2c0 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
2a2d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
2a2e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
2a2f0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
2a300 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
2a310 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2a320 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
2a330 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
2a340 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
2a350 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
2a360 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
2a370 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
2a380 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
2a390 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
2a3a0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
2a3b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
2a3c0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2a3d0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
2a3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2a3f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2a400 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
2a410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a420 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
2a430 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
2a440 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
2a450 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
2a460 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
2a470 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
2a480 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
2a490 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
2a4a0 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
2a4b0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
2a4c0 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
2a4d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a4e0 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
2a4f0 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
2a500 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
2a510 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
2a520 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
2a530 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
2a540 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
2a550 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
2a560 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
2a570 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
2a580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2a590 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
2a5a0 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
2a5b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
2a5c0 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
2a5d0 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
2a5e0 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
2a5f0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
2a600 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
2a610 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
2a620 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
2a630 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
2a640 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
2a650 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a660 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
2a670 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
2a680 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
2a690 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
2a6a0 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
2a6b0 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
2a6c0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
2a6d0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
2a6e0 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
2a6f0 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
2a700 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
2a710 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
2a720 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
2a730 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
2a740 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
2a750 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
2a760 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2a770 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
2a780 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
2a790 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
2a7a0 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
2a7b0 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
2a7c0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
2a7d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
2a7e0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
2a7f0 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
2a800 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
2a810 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
2a820 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
2a830 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
2a840 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
2a850 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
2a860 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
2a870 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
2a880 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
2a890 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
2a8a0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
2a8b0 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
2a8c0 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
2a8d0 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
2a8e0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
2a8f0 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
2a900 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
2a910 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
2a920 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2a930 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
2a940 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2a950 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
2a960 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2a970 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
2a980 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
2a990 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2a9a0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
2a9b0 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
2a9c0 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
2a9d0 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
2a9e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
2a9f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2aa00 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2aa10 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
2aa20 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
2aa30 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2aa40 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2aa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2aa60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2aa70 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2aa80 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2aa90 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
2aaa0 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
2aab0 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
2aac0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
2aad0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2aae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2aaf0 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50  ->tempFile || pP
2ab00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2ab10 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
2ab20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ab30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
2ab40 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
2ab50 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2ab60 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
2ab70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
2ab80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ab90 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
2aba0 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
2abb0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
2abc0 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
2abd0 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
2abe0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
2abf0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2ac00 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
2ac10 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
2ac20 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
2ac30 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
2ac40 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
2ac50 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
2ac60 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2ac70 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
2ac80 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
2ac90 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
2aca0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
2acb0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
2acc0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
2acd0 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
2ace0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
2acf0 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
2ad00 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
2ad10 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
2ad20 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
2ad30 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
2ad40 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
2ad50 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2ad60 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
2ad70 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
2ad80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ad90 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
2ada0 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
2adb0 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
2adc0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
2add0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
2ade0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
2adf0 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
2ae00 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
2ae10 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2ae20 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
2ae30 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
2ae40 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
2ae50 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
2ae60 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2ae70 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
2ae80 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
2ae90 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
2aea0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2aeb0 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
2aec0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2aed0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
2aee0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
2aef0 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
2af00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
2af10 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
2af20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
2af30 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2af40 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
2af50 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
2af60 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
2af70 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
2af80 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
2af90 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
2afa0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
2afb0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
2afc0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
2afd0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
2afe0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
2aff0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
2b000 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
2b010 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
2b020 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
2b030 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
2b040 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
2b050 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
2b060 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
2b070 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2b080 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
2b090 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
2b0a0 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
2b0b0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2b0c0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
2b0d0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
2b0e0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
2b0f0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
2b100 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
2b110 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
2b120 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b150 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
2b160 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
2b170 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
2b180 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2b190 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2b1a0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
2b1b0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
2b1c0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
2b1d0 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
2b1e0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
2b1f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2b200 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2b210 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
2b220 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
2b230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2b240 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
2b250 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
2b260 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
2b270 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b280 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2b290 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
2b2a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2b2b0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
2b2c0 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
2b2d0 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
2b2e0 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
2b2f0 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
2b300 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
2b310 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
2b320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b330 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
2b340 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
2b350 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
2b360 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2b370 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
2b380 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
2b390 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
2b3a0 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
2b3b0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
2b3c0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
2b3d0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
2b3e0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2b3f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b400 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2b410 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2b420 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2b430 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
2b440 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
2b450 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2b460 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
2b470 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
2b480 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
2b490 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
2b4a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2b4b0 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
2b4c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
2b4d0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
2b4e0 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
2b4f0 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
2b500 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
2b510 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
2b520 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
2b530 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2b540 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2b550 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2b560 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2b570 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
2b580 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
2b590 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2b5a0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
2b5b0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2b5c0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2b5d0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
2b5e0 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
2b5f0 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
2b600 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2b610 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b620 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2b630 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
2b640 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
2b650 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
2b660 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
2b670 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b680 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
2b690 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2b6a0 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
2b6b0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2b6c0 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
2b6d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2b6e0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2b6f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2b700 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
2b710 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
2b720 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
2b730 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
2b740 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2b750 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
2b760 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
2b770 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
2b780 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
2b790 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2b7a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2b7b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b7c0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2b7d0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2b7e0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2b7f0 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   =  SQLITE_OPEN_
2b800 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c  SUBJOURNAL | SQL
2b810 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2b820 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  TE .      | SQLI
2b830 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
2b840 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2b850 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20  LUSIVE .      | 
2b860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2b870 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69  TEONCLOSE;.    i
2b880 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20  nt nStmtSpill = 
2b890 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
2b8a0 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66  tmtSpill;.    if
2b8b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2b8c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2b8d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2b8e0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2b8f0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2b900 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31   nStmtSpill = -1
2b910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2b920 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2b930 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
2b940 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  , 0, pPager->sjf
2b950 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53  d, flags, nStmtS
2b960 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pill);.  }.  ret
2b970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b980 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
2b990 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2b9a0 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
2b9b0 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
2b9c0 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal. .**.** If 
2b9d0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2b9e0 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
2b9f0 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
2ba00 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
2ba10 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
2ba20 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
2ba30 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2ba40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ba50 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2ba60 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
2ba70 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2ba80 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
2ba90 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
2baa0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
2bab0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2bac0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
2bad0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2bae0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
2baf0 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
2bb00 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
2bb10 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
2bb20 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2bb30 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
2bb40 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
2bb50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
2bb60 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2bb70 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2bb80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2bb90 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2bba0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
2bbb0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
2bbc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
2bbd0 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
2bbe0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
2bbf0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2bc00 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2bc10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bc20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2bc30 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
2bc40 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2bc50 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2bc60 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2bc70 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
2bc80 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2bc90 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2bca0 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2bcb0 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
2bcc0 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20  al(pPager, pPg) 
2bcd0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
2bce0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2bcf0 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
2bd00 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
2bd10 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2bd20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2bd30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
2bd40 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
2bd50 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
2bd60 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
2bd70 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
2bd80 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
2bd90 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
2bda0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bdb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
2bdc0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
2bdd0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
2bde0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
2bdf0 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  )pPager->nSubRec
2be00 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
2be10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
2be20 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23 69 66 20  r *pData2;..#if 
2be30 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
2be40 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 21 70     .      if( !p
2be50 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2be60 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 43  ory ){.        C
2be70 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
2be80 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
2be90 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
2bea0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61  _NOMEM_BKPT, pDa
2beb0 74 61 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ta2);.      }els
2bec0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  e.#endif.      p
2bed0 44 61 74 61 32 20 3d 20 70 44 61 74 61 3b 0a 20  Data2 = pData;. 
2bee0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2bef0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
2bf00 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2bf10 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2bf20 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2bf30 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
2bf40 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
2bf50 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
2bf60 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2bf70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bf80 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2bf90 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2bfa0 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
2bfb0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2bfc0 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
2bfd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bfe0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
2c000 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
2c010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c020 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
2c030 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
2c040 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2c050 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2c060 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2c070 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2c080 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2c090 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67 48  geIfRequired(PgH
2c0a0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
2c0b0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2c0c0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65 74  (pPg) ){.    ret
2c0d0 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  urn subjournalPa
2c0e0 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65  ge(pPg);.  }else
2c0f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c100 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
2c110 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c120 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2c130 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
2c140 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
2c150 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
2c160 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
2c170 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
2c180 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
2c190 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
2c1a0 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
2c1b0 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
2c1c0 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
2c1d0 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
2c1e0 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
2c1f0 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
2c200 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
2c210 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
2c220 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
2c230 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
2c240 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
2c250 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2c260 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
2c270 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
2c280 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
2c290 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
2c2a0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
2c2b0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
2c2c0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
2c2d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
2c2e0 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
2c2f0 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
2c300 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
2c310 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2c320 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
2c330 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
2c340 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
2c350 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
2c360 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
2c370 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
2c380 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2c390 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
2c3a0 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
2c3b0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2c3c0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2c3d0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2c3e0 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
2c3f0 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
2c400 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
2c410 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2c420 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
2c430 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
2c440 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
2c450 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
2c460 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2c470 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
2c480 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
2c490 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2c4a0 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
2c4b0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
2c4c0 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
2c4d0 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
2c4e0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2c4f0 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
2c500 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
2c510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2c520 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
2c530 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
2c540 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
2c550 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
2c560 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
2c570 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69 74  Spill NOSYNC bit
2c580 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74   is set during t
2c590 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20  imes when doing 
2c5a0 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a  a sync of.  ** j
2c5b0 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69  ournal (and addi
2c5c0 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29  ng a new header)
2c5d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e   is not allowed.
2c5e0 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20    This occurs.  
2c5f0 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20  ** during calls 
2c600 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
2c610 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79  rite() while try
2c620 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d  ing to journal m
2c630 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67  ultiple.  ** pag
2c640 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  es belonging to 
2c650 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e  the same sector.
2c660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64  .  **.  ** The d
2c670 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42 41  oNotSpill ROLLBA
2c680 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73 20  CK and OFF bits 
2c690 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
2c6a0 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a  he spilling.  **
2c6b0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2c6c0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2c6d0 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
2c6e0 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20 64  .  This is set d
2c6f0 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f 6c  uring.  ** a rol
2c700 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65 72  lback or by user
2c710 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65 63   request, respec
2c720 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  tively..  **.  *
2c730 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c  * Spilling is al
2c740 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68  so prohibited wh
2c750 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  en in an error s
2c760 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20  tate since that 
2c770 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20  could.  ** lead 
2c780 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
2c790 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65  uption.   In the
2c7a0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
2c7b0 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a 2a  ntation it .  **
2c7c0 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2c7d0 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  or sqlite3Pcache
2c7e0 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61  Fetch() to be ca
2c7f0 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65  lled with create
2c800 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68 69  Flag==3.  ** whi
2c810 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  le in the error 
2c820 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20  state, hence it 
2c830 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
2c840 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
2c850 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  o.  ** be called
2c860 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2c870 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ate.  Neverthele
2c880 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61  ss, we include a
2c890 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65   NEVER().  ** te
2c8a0 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72  st for the error
2c8b0 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65   state as a safe
2c8c0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75  guard against fu
2c8d0 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20  ture changes..  
2c8e0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2c8f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2c900 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c910 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  OK;.  testcase( 
2c920 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2c930 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
2c940 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65 73  OLLBACK );.  tes
2c950 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2c960 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
2c970 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20 74  LFLAG_OFF );.  t
2c980 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2c990 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2c9a0 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 29  ILLFLAG_NOSYNC )
2c9b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2c9c0 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26 26  doNotSpill.   &&
2c9d0 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74   ((pPager->doNot
2c9e0 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46 4c  Spill & (SPILLFL
2c9f0 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c  AG_ROLLBACK|SPIL
2ca00 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a 20  LFLAG_OFF))!=0. 
2ca10 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c       || (pPg->fl
2ca20 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
2ca30 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b 0a  _SYNC)!=0).  ){.
2ca40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ca50 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  E_OK;.  }..  pPg
2ca60 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
2ca70 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
2ca80 70 50 61 67 65 72 29 20 29 7b 0a 23 69 66 6e 64  pPager) ){.#ifnd
2ca90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2caa0 4f 4e 43 55 52 52 45 4e 54 0a 20 20 20 20 2f 2a  ONCURRENT.    /*
2cab0 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
2cac0 69 6f 6e 20 69 73 20 61 20 22 42 45 47 49 4e 20  ion is a "BEGIN 
2cad0 43 4f 4e 43 55 52 52 45 4e 54 22 20 74 72 61 6e  CONCURRENT" tran
2cae0 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67  saction, the pag
2caf0 65 20 0a 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74  e .    ** cannot
2cb00 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64   be flushed to d
2cb10 69 73 6b 2e 20 52 65 74 75 72 6e 20 65 61 72 6c  isk. Return earl
2cb20 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  y in this case. 
2cb30 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2cb40 72 2d 3e 70 41 6c 6c 52 65 61 64 20 29 20 72 65  r->pAllRead ) re
2cb50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cb60 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
2cb70 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72  rite a single fr
2cb80 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ame for this pag
2cb90 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f  e to the log. */
2cba0 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
2cbb0 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2cbc0 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66  ed(pPg); .    if
2cbd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cbe0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
2cbf0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61  gerWalFrames(pPa
2cc00 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b  ger, pPg, 0, 0);
2cc10 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2cc20 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49      .#ifdef SQLI
2cc30 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
2cc40 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2cc50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
2cc60 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
2cc70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2cc80 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2cc90 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2cca0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ccb0 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65 72  K ) return pager
2ccc0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2ccd0 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  c);.    }.#endif
2cce0 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  .  .    /* Sync 
2ccf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cd00 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2cd10 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
2cd20 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2cd30 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  YNC .     || pPa
2cd40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2cd50 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
2cd60 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  OD.    ){.      
2cd70 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2cd80 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
2cd90 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69   }.  .    /* Wri
2cda0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2cdb0 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
2cdc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2cdd0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2cde0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cdf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ce00 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2ce10 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2ce20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2ce30 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2ce40 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  st(pPager, pPg);
2ce50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2ce60 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
2ce70 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66  s clean. */.  if
2ce80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ce90 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2cea0 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61  E(("STRESS %d pa
2ceb0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2cec0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2ced0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  pgno));.    sqli
2cee0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2cef0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  an(pPg);.  }..  
2cf00 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2cf10 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20  or(pPager, rc); 
2cf20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
2cf30 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64  all unreferenced
2cf40 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2cf50 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
2cf60 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 50  ite3PagerFlush(P
2cf70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2cf80 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72   int rc = pPager
2cf90 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28  ->errCode;.  if(
2cfa0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50   !MEMDB ){.    P
2cfb0 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
2cfc0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2cfd0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2cfe0 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ache);.    asser
2cff0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
2d000 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
2d010 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2d020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2d030 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  st ){.      PgHd
2d040 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
2d050 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20  ->pDirty;.      
2d060 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d  if( pList->nRef=
2d070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2d080 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28 28   = pagerStress((
2d090 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c  void*)pPager, pL
2d0a0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
2d0b0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78      pList = pNex
2d0c0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2d0d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2d0e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2d0f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2d100 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2d110 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2d120 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2d130 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2d140 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2d150 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2d160 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2d170 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2d180 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2d190 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2d1a0 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2d1b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d1c0 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2d1d0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2d1e0 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2d1f0 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2d200 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2d210 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2d220 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2d230 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2d240 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2d250 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2d260 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2d270 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2d280 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d290 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2d2a0 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2d2b0 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2d2c0 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2d2d0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2d2e0 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2d2f0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2d300 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2d310 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2d320 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2d330 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2d340 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2d350 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2d360 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2d370 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2d380 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2d390 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2d3a0 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2d3b0 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2d3c0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2d3d0 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65   API.  When a ne
2d3e0 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  w page is alloca
2d3f0 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73  ted, the.** firs
2d400 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 69  t 8 bytes of thi
2d410 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f  s space are zero
2d420 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61 69  ed but the remai
2d430 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61  nder is uninitia
2d440 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65  lized..** (The e
2d450 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75 73  xtra space is us
2d460 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20 74  ed by btree as t
2d470 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2d480 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  t.).**.** The fl
2d490 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2d4a0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2d4b0 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2d4c0 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2d4d0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2d4e0 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2d4f0 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2d500 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2d510 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2d520 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2d530 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2d540 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2d550 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2d560 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2d570 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2d580 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2d590 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2d5a0 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2d5b0 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2d5c0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2d5d0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2d5e0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2d5f0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2d600 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2d610 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2d620 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2d630 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2d640 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2d650 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2d660 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2d670 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2d680 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2d690 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2d6a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2d6b0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2d6c0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2d6d0 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2d6e0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2d6f0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2d700 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2d710 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2d720 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2d730 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d740 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2d750 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2d760 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2d770 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2d780 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2d790 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2d7a0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2d7b0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2d7c0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2d7d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d7e0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2d7f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d800 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2d810 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2d820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2d830 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2d840 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2d850 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2d860 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2d870 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2d880 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2d890 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2d8a0 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2d8b0 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2d8c0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2d8d0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2d8e0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2d8f0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2d900 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2d910 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2d920 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2d930 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2d940 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2d950 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2d960 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2d970 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2d980 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d990 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d9a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2d9b0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2d9c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2d9d0 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2d9e0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2d9f0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2da00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2da10 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2da20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2da30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2da40 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2da50 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2da60 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2da70 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2da80 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2da90 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2daa0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2dab0 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2dac0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2dad0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2dae0 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2daf0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2db00 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2db10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2db20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2db30 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2db40 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2db50 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2db60 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2db70 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2db80 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2db90 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2dba0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2dbb0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2dbc0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2dbd0 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2dbe0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2dbf0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2dc00 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2dc10 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2dc20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2dc30 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2dc40 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2dc50 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2dc60 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dc70 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2dc80 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2dc90 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2dca0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2dcb0 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2dcc0 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2dcd0 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2dce0 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2dcf0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2dd00 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2dd10 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2dd20 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e  al).  */.  journ
2dd30 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2dd40 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2dd50 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a  alSize(pVfs));..
2dd60 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2dd70 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2dd80 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2dd90 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2dda0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2ddb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ddc0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2ddd0 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2dde0 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2ddf0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2de00 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2de10 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2de20 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2de30 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2de40 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2de50 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2de60 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2de70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2de80 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74  BKPT;.      nPat
2de90 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2dea0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2deb0 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2dec0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2ded0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2dee0 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2def0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2df00 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2df10 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2df20 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2df30 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2df40 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2df50 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2df60 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2df70 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2df80 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2df90 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2dfa0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2dfb0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2dfc0 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2dfd0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2dfe0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2dff0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2e000 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2e010 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2e020 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2e030 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2e040 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2e050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2e060 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2e070 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2e080 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2e090 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2e0a0 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2e0b0 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2e0c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2e0d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2e0e0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2e0f0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2e100 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2e110 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e120 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2e130 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2e140 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2e150 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2e160 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2e170 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2e180 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2e190 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2e1a0 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2e1b0 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2e1c0 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2e1d0 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2e1e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2e1f0 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2e200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e210 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2e220 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2e230 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2e240 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2e250 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2e260 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2e270 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2e280 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2e290 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2e2a0 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2e2b0 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2e2c0 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2e2d0 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2e2e0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2e2f0 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2e300 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2e310 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2e320 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2e330 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2e340 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2e350 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2e360 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2e370 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2e380 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2e390 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2e3a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2e3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e3c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e3d0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2e3e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e3f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2e400 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2e410 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2e420 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2e430 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2e440 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2e450 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2e460 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2e470 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2e480 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2e490 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2e4a0 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2e4b0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2e4c0 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4e0 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2e4f0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2e500 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e520 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2e530 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2e540 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2e550 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2e560 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2e570 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2e580 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2e590 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2e5a0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2e5b0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2e5c0 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2e5d0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2e5e0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2e5f0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2e600 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2e610 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2e620 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2e630 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2e640 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2e650 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2e660 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2e670 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2e680 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2e690 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2e6a0 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2e6b0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2e6c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2e6d0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2e6e0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2e6f0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2e700 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2e710 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2e720 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2e730 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2e740 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2e750 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2e760 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2e770 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2e780 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2e790 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2e7a0 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2e7b0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2e7c0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2e7d0 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2e7e0 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2e7f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2e800 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2e810 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2e820 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2e830 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2e840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2e850 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2e860 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2e870 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2e880 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2e890 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2e8a0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2e8b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2e8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2e8d0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  M_BKPT;.  }.  pP
2e8e0 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2e8f0 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2e900 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2e910 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2e920 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2e930 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2e940 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2e950 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2e960 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2e970 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2e980 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2e990 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2e9a0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2e9b0 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2e9c0 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2e9d0 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2e9e0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2e9f0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2ea00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2ea10 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2ea20 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2ea30 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2ea40 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2ea50 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2ea60 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2ea70 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2ea80 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2ea90 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2eaa0 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2eab0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2eac0 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2ead0 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2eae0 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2eaf0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2eb00 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2eb10 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2eb20 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2eb30 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2eb40 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2eb50 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2eb60 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2eb70 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2eb80 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2eb90 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2eba0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2ebb0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2ebc0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2ebd0 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2ebe0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2ebf0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2ec00 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2ec10 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2ec20 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2ec30 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2ec40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2ec50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ec60 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2ec70 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2ec80 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2ec90 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2eca0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2ecb0 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2ecc0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2ecd0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2ece0 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2ecf0 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2ed00 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2ed10 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2ed20 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2ed30 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2ed40 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2ed50 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2ed60 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2ed70 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2ed80 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2ed90 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2eda0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2edb0 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2edc0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2edd0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2ede0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2edf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2ee00 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2ee10 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2ee20 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2ee30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2ee40 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2ee50 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2ee60 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2ee70 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2ee80 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2ee90 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2eea0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2eeb0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2eec0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2eed0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2eee0 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2eef0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2ef00 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2ef10 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2ef20 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2ef30 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2ef40 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2ef50 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2ef60 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2ef70 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2ef80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2ef90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2efa0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2efb0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2efc0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2efd0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2efe0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2eff0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2f000 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2f010 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2f020 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2f030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f040 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2f050 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2f060 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2f070 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2f080 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2f090 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2f0a0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2f0b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2f0c0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2f0d0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2f0e0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f0f0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2f100 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2f110 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2f120 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2f130 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2f140 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2f150 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f160 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2f170 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2f180 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2f190 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2f1a0 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2f1b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2f1c0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2f1d0 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2f1e0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2f1f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2f200 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2f210 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2f220 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2f230 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2f240 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2f250 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2f260 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2f270 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f280 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2f290 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2f2a0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2f2b0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2f2c0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2f2d0 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2f2e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2f2f0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2f300 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f310 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2f320 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2f330 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2f340 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2f350 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2f360 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2f370 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2f380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f390 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2f3a0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2f3b0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2f3c0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2f3d0 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2f3e0 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2f3f0 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2f400 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2f410 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2f420 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2f430 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2f440 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2f450 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2f460 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2f470 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2f480 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2f490 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2f4a0 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2f4b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2f4c0 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2f4d0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2f4e0 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2f4f0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2f500 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2f510 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2f520 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2f530 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2f540 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2f550 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2f560 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2f570 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2f580 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2f590 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2f5a0 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2f5b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2f5c0 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2f5d0 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2f5e0 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2f5f0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2f600 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2f610 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2f620 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2f630 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2f640 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2f650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f660 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2f670 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2f680 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2f690 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2f6a0 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2f6b0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2f6c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2f6d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2f6e0 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
2f6f0 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
2f700 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
2f710 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2f720 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2f730 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
2f740 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
2f750 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
2f760 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2f770 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f780 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2f790 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2f7a0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2f7b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2f7c0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2f7d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2f7e0 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2f7f0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2f800 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2f810 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2f820 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2f830 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2f840 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2f850 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2f860 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f870 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2f880 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2f890 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2f8a0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2f8b0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2f8c0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2f8d0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2f8e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2f8f0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2f900 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2f910 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2f920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f930 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2f940 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61  8(nExtra);.    a
2f950 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38  ssert( nExtra>=8
2f960 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20   && nExtra<1000 
2f970 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2f980 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2f990 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2f9a0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9c0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2f9d0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2f9e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2f9f0 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
2fa00 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2fa10 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
2fa20 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
2fa30 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2fa40 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2fa50 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2fa60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2fa70 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2fa80 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2fa90 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
2faa0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
2fab0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2fac0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2fad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2fae0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2faf0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2fb00 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2fb10 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2fb20 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2fb30 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2fb40 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2fb50 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2fb60 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2fb70 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2fb80 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2fb90 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2fba0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fbb0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2fbc0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2fbd0 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2fbe0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2fbf0 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2fc00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2fc10 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2fc20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2fc30 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2fc40 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2fc50 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2fc60 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2fc70 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2fc80 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
2fc90 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2fca0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2fcb0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2fcc0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2fcd0 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2fce0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2fcf0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2fd00 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2fd10 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2fd20 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2fd30 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2fd40 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2fd50 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2fd60 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2fd70 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2fd80 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2fd90 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2fda0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2fdb0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2fdc0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2fdd0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2fde0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2fdf0 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2fe00 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2fe10 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2fe20 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2fe30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2fe40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2fe50 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2fe60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2fe70 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2fe80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2fe90 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b  >extraSync==0 );
2fea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2feb0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2fec0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fed0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2fee0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2fef0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ff00 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2ff10 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2ff20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2ff30 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2ff40 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30  r->extraSync = 0
2ff50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2ff60 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2ff70 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2ff80 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2ff90 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2ffa0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41  SYNC_NORMAL | WA
2ffb0 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
2ffc0 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ONS;.    pPager-
2ffd0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2ffe0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2fff0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  MAL;.  }.  /* pP
30000 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
30010 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
30020 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
30030 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
30040 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
30050 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
30060 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
30070 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
30080 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
30090 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
300a0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
300b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
300c0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
300d0 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
300e0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
300f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
30100 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
30110 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30120 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
30130 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
30140 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
30150 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
30160 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
30170 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
30180 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
30190 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
301a0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
301b0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
301c0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
301d0 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
301e0 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
301f0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
30200 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  d(pPager);.  /* 
30210 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
30220 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
30230 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
30240 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
30250 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45  >szMmap = SQLITE
30260 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
30270 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65  ZE // will be se
30280 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a  t by btree.c */.
30290 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
302a0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
302b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
302c0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
302d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
302e0 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65  as not be delete
302f0 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74  d or renamed out
30300 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74   from.** under t
30310 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  he pager.  Retur
30320 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  n SQLITE_OK if t
30330 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
30340 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67  till were it oug
30350 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64  ht.** to be on d
30360 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e  isk.  Return non
30370 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45  -zero (SQLITE_RE
30380 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f  ADONLY_DBMOVED o
30390 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
303a0 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20  or.** code from 
303b0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
303c0 29 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  )) if the databa
303d0 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73  se has gone miss
303e0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
303f0 6e 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d  nt databaseIsUnm
30400 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  oved(Pager *pPag
30410 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d  er){.  int bHasM
30420 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  oved = 0;.  int 
30430 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
30440 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65  r->tempFile ) re
30450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30460 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
30470 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Size==0 ) return
30480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
30490 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46  sert( pPager->zF
304a0 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65  ilename && pPage
304b0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  r->zFilename[0] 
304c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
304d0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
304e0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
304f0 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
30500 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a  D, &bHasMoved);.
30510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30520 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20  _NOTFOUND ){.   
30530 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d   /* If the HAS_M
30540 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  OVED file-contro
30550 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74  l is unimplement
30560 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
30570 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
30580 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76  has not been mov
30590 65 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65  ed.  That is the
305a0 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61   historical beha
305b0 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20  vior of SQLite: 
305c0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20  prior to.    ** 
305d0 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69  version 3.8.3, i
305e0 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20  t never checked 
305f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
30600 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
30610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30620 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b   && bHasMoved ){
30630 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
30640 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
30650 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
30660 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
30670 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30680 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
30690 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
306a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
306b0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
306c0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
306d0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
306e0 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
306f0 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
30700 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
30710 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
30720 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
30730 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
30740 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
30750 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
30760 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
30770 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
30780 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
30790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
307a0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
307b0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
307c0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
307d0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
307e0 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
307f0 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
30800 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
30810 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
30820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30830 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
30840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
30850 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
30860 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
30870 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
30880 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
30890 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
308a0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
308b0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
308c0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
308d0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
308e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
308f0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
30900 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
30910 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
30920 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
30930 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
30940 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
30950 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
30960 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
30970 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
30980 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
30990 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
309a0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
309b0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
309c0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
309d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
309e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
309f0 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
30a00 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
30a10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
30a20 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
30a30 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
30a40 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
30a50 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
30a60 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
30a70 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
30a80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30a90 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
30aa0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
30ab0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
30ac0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
30ad0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
30ae0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
30af0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
30b00 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
30b10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30b20 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
30b30 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
30b40 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
30b50 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
30b60 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
30b70 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
30b80 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
30b90 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
30ba0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
30bb0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
30bc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
30bd0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
30be0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
30bf0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
30c00 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
30c10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
30c20 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
30c30 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
30c40 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
30c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30c60 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
30c70 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
30c80 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
30c90 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
30ca0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
30cb0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
30cc0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
30cd0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
30ce0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
30cf0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
30d00 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
30d10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
30d20 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
30d30 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30d40 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
30d50 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
30d60 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
30d70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
30d80 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
30d90 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
30da0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30db0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
30dc0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
30dd0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
30de0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
30df0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
30e10 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
30e20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
30e30 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
30e40 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
30e50 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
30e60 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
30e70 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
30e80 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
30e90 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
30ea0 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
30eb0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
30ec0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
30ed0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
30ee0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
30ef0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
30f00 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
30f10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30f20 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
30f30 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
30f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30f50 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
30f60 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
30f70 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
30f80 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
30f90 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
30fa0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
30fb0 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
30fc0 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
30fd0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
30fe0 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
30ff0 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
31000 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
31010 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
31020 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
31030 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31040 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
31050 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
31060 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
31070 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
31080 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
31090 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
310a0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
310b0 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
310c0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
310d0 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
310e0 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
310f0 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
31100 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
31110 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
31120 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
31130 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
31140 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
31150 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
31160 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
31170 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
31180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31190 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
311a0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
311b0 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
311c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
311d0 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
311e0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
311f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
31210 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
31220 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  le */..      ass
31230 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
31240 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pFile==0 );.    
31250 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
31260 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
31270 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
31280 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31290 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
312a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
312b0 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69  zero pages in si
312c0 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ze, that means t
312d0 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74  hat either (1) t
312e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
312f0 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61  urnal is a remna
31300 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  nt from a prior 
31310 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
31320 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72  e same name wher
31330 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
31340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
31350 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  ut not the journ
31360 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20  al was deleted, 
31370 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69  or (2) the initi
31380 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  al.        ** tr
31390 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70  ansaction that p
313a0 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64  opulates a new d
313b0 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67  atabase is being
313c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
313d0 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68        ** In eith
313e0 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75  er case, the jou
313f0 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65  rnal file can be
31400 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76   deleted.  Howev
31410 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20  er, take care.  
31420 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20        ** not to 
31430 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31440 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
31450 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75   already open du
31460 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
31470 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52  journal_mode=PER
31480 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f  SIST..        */
31490 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
314a0 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70  ge==0 && !jrnlOp
314b0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
314c0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
314d0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
314e0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
314f0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
31500 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
31510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
31530 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
31540 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
31550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
31560 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
31570 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65  usiveMode ) page
31580 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
31590 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
315a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
315b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
315c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
315d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
315e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
315f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
31600 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
31610 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
31620 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
31630 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
31640 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
31650 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
31660 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
31670 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
31680 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
31690 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
316a0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
316b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
316c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
316d0 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
316e0 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
316f0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
31700 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
31710 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
31720 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
31730 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31740 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
31750 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
31760 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
31770 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
31780 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
31790 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
317a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
317b0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
317c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
317d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
317e0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
317f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31810 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69             u8 fi
31820 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
31830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31840 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
31850 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
31860 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
31870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
31880 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
31890 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
318a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
318b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
318c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
318d0 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
318e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
318f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
31900 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
31910 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31920 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
31930 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a  s = (first!=0);.
31940 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
31950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  if( rc==SQLITE_C
31960 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20  ANTOPEN ){.     
31970 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
31980 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  cannot open the 
31990 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
319a0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
319b0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20  o see if.       
319c0 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61       ** it has a
319d0 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68   zero header, th
319e0 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  at might be due 
319f0 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c  to an I/O error,
31a00 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
31a10 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  ** it might be d
31a20 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63  ue to the race c
31a30 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
31a40 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a  ed above and in.
31a50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
31a60 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69  icket #3883.  Ei
31a70 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65  ther way, assume
31a80 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
31a90 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20  l is hot..      
31aa0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
31ab0 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70  ght be a false p
31ac0 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66  ositive.  But if
31ad0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
31ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31af0 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61  automatic journa
31b00 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72  l playback and r
31b10 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73  ecovery mechanis
31b20 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20  m will deal.    
31b30 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
31b40 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c  it under an EXCL
31b50 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65  USIVE lock where
31b60 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
31b70 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
31b80 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20  * worry so much 
31b90 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74  with race condit
31ba0 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ions..          
31bb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
31bc0 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
31bd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31be0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
31bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31c10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
31c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
31c30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31c40 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  d to obtain a sh
31c50 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
31c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
31c70 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
31c80 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
31c90 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c  PagerGet() until
31ca0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
31cb0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
31cc0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
31cd0 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
31ce0 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
31cf0 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
31d00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31d10 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
31d20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
31d30 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
31d40 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
31d50 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
31d60 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
31d70 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
31d80 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
31d90 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
31da0 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
31db0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
31dc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
31dd0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
31de0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
31df0 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
31e00 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
31e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
31e20 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
31e30 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
31e40 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
31e50 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
31e60 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
31e70 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
31e80 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
31e90 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
31ea0 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
31eb0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
31ec0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
31ed0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
31ee0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
31ef0 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
31f00 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
31f10 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
31f20 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
31f30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
31f40 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
31f50 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
31f60 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
31f70 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
31f80 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
31f90 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
31fa0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
31fb0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
31fc0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
31fd0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
31fe0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
31ff0 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
32000 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
32010 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
32020 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
32030 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
32040 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
32050 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
32060 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
32070 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
32080 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
32090 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
320a0 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
320b0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
320c0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
320d0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
320e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
320f0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
32100 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
32110 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
32120 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
32130 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
32140 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
32150 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
32160 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
32170 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
32180 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
32190 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
321a0 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
321b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
321c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
321d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
321e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
321f0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
32200 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
32210 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
32220 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
32230 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
32240 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
32250 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
32260 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
32270 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
32280 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
32290 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
322a0 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
322b0 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
322c0 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
322d0 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
322e0 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61  ss mode.  */.  a
322f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
32300 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
32310 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
32320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
32330 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
32340 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
32350 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
32360 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32370 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
32380 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
32390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
323a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
323b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
323c0 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
323d0 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
323e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
323f0 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
32400 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
32410 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
32420 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
32430 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
32440 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
32450 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32460 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32470 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
32480 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32490 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
324a0 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   );..    rc = pa
324b0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
324c0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
324d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
324e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
324f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
32500 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
32510 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
32520 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
32530 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  OCK );.      got
32540 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
32550 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
32560 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
32570 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
32580 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
32590 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
325a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
325b0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
325c0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
325d0 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
325e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
325f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48  Pager->eLock<=SH
32600 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
32610 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
32620 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62  urnal(pPager, &b
32630 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
32640 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
32650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32660 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f     }.    if( bHo
32680 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
32690 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
326a0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
326b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
326c0 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b  ADONLY_ROLLBACK;
326d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
326e0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
326f0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
32700 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
32710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32720 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
32730 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
32740 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
32750 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
32760 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
32770 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
32780 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
32790 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
327a0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
327b0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
327c0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
327d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
327e0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
327f0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
32800 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
32810 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
32820 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
32830 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32840 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
32850 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
32860 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
32870 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
32880 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
32890 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
328a0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
328b0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
328c0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
328d0 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
328e0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
328f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32900 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
32910 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
32920 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
32930 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
32940 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
32950 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
32960 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
32970 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
32980 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
32990 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
329a0 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  n locking_mode=e
329b0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
329c0 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20  he lock is.     
329d0 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74   ** downgraded t
329e0 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65  o SHARED_LOCK be
329f0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
32a00 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20  on returns..    
32a10 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32a20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
32a30 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
32a40 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
32a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32a60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32a70 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  led;.      }. . 
32a80 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73       /* If it is
32a90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32aa0 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65  n and the file e
32ab0 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f  xists on disk, o
32ac0 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  pen the .      *
32ad0 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  * journal for re
32ae0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
32af0 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73   Write access is
32b00 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
32b10 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65  e .      ** in e
32b20 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
32b30 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65  mode the file de
32b40 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
32b50 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20   kept open .    
32b60 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c    ** and possibl
32b70 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
32b80 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
32b90 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61  n. Also, write-a
32ba0 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20  ccess .      ** 
32bb0 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69  is usually requi
32bc0 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  red to finalize 
32bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a  the journal in j
32be0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73  ournal_mode=pers
32bf0 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  ist .      ** mo
32c00 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72  de (and also for
32c10 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72   journal_mode=tr
32c20 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73  uncate on some s
32c30 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a  ystems)..      *
32c40 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
32c50 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
32c60 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
32c70 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
32c80 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f  some .      ** o
32c90 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
32ca0 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
32cb0 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
32cc0 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
32cd0 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
32ce0 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
32cf0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
32d00 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
32d10 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
32d20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
32d30 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
32d40 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
32d50 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  .      ** functi
32d60 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e  on was called an
32d70 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
32d80 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
32d90 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
32da0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
32db0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
32dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
32dd0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
32de0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
32df0 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73         int bExis
32e00 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
32e10 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
32e20 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
32e30 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
32e40 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
32e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66  .            pVf
32e60 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32e70 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
32e80 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69  SS_EXISTS, &bExi
32e90 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sts);.        if
32ea0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32eb0 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20  && bExists ){.  
32ec0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
32ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
32ee0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
32ef0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
32f00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
32f10 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
32f20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
32f30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
32f40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
32f50 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
32f60 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
32f70 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
32f80 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
32f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
32fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
32fb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32fc0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
32fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32fe0 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
32ff0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
33000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
33010 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
33020 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
33030 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
33040 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
33050 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33070 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
33080 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
33090 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
330a0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
330b0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
330c0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
330d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
330e0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
330f0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
33100 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
33110 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
33120 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
33130 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
33140 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
33150 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
33160 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
33170 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
33180 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
33190 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
331a0 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
331b0 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
331c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
331d0 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
331e0 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
331f0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
33200 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
33210 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
33220 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
33230 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
33240 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
33250 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
33260 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
33270 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33280 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  K );.        rc 
33290 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
332a0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
332b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
332c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
332d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
332e0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
332f0 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  , !pPager->tempF
33300 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
33310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33320 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
33330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33340 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
33350 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
33360 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e  .        pagerUn
33370 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
33380 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
33390 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
333a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
333b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
333c0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
333d0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
333e0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
333f0 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   to open.       
33400 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b   ** or roll back
33410 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
33420 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  hile holding an 
33430 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
33440 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  The.        ** p
33450 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f  ager_unlock() ro
33460 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61  utine will be ca
33470 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  lled before retu
33480 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a  rning to unlock.
33490 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
334a0 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f  ile. If the unlo
334b0 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  ck attempt fails
334c0 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f  , then Pager.eLo
334d0 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20  ck must be.     
334e0 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b     ** set to UNK
334f0 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74  NOWN_LOCK (see t
33500 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
33510 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
33520 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b   .        ** UNK
33530 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20  NOWN_LOCK above 
33540 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
33550 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  on). .        **
33560 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f  .        ** In o
33570 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65  rder to get page
33580 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f  r_unlock() to do
33590 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72   this, set Pager
335a0 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20  .eState to.     
335b0 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f     ** PAGER_ERRO
335c0 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e  R now. This is n
335d0 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e  ot actually coun
335e0 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74  ted as a transit
335f0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
33600 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e  o ERROR state in
33610 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72   the state diagr
33620 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  am at the top of
33630 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20   this file,.    
33640 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
33650 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61  know that the sa
33660 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  me call to pager
33670 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76  _unlock() will v
33680 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ery.        ** s
33690 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f  hortly transitio
336a0 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
336b0 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73  ct to the OPEN s
336c0 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20  tate. Calling.  
336d0 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f        ** assert_
336e0 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f  pager_state() wo
336f0 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73  uld fail now, as
33700 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62   it should not b
33710 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  e possible.     
33720 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45     ** to be in E
33730 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
33740 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f  there are zero o
33750 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
33760 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65  .        ** refe
33770 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20  rences..        
33780 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
33790 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
337a0 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
337b0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
337c0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
337d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
337e0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
337f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
33800 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52  ger->eLock==SHAR
33810 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
33820 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
33830 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
33840 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53   pPager->eLock>S
33850 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
33860 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
33870 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
33880 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d  pFile && pPager-
33890 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
338a0 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ck ){.      /* T
338b0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
338c0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
338d0 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b  uired then check
338e0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65   to.      ** see
338f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
33900 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
33910 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
33920 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
33930 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68  ,.      ** flush
33940 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
33950 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
33960 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73  ck flag prevents
33970 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20   this from.     
33980 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e   ** occurring on
33990 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
339a0 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65  access to a file
339b0 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61  , in order to sa
339c0 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  ve a.      ** si
339d0 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79  ngle unnecessary
339e0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
339f0 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61   call at the sta
33a00 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a  rt-up..      **.
33a10 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
33a20 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65  e changes are de
33a30 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
33a40 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
33a50 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
33a60 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
33a70 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
33a80 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
33a90 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
33aa0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
33ab0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
33ac0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
33ad0 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
33ae0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
33af0 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
33b00 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
33b10 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
33b20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
33b30 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
33b40 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
33b50 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
33b60 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
33b70 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
33b80 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
33b90 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
33ba0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
33bb0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
33bc0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
33bd0 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
33be0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
33bf0 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
33c00 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
33c10 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
33c20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
33c30 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52  s)];..      IOTR
33c40 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
33c50 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
33c60 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
33c70 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  )));.      rc = 
33c80 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
33c90 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
33ca0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
33cb0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
33cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33ce0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33cf0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
33d00 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
33d10 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
33d30 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
33d40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
33d50 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
33d60 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
33d70 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
33d80 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
33d90 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
33da0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
33db0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
33dc0 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
33dd0 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
33de0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33df0 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
33e00 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
33e10 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
33e20 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
33e30 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
33e40 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
33e50 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
33e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
33e70 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
33e80 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
33e90 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
33ea0 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
33eb0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
33ec0 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
33ed0 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
33ee0 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
33ef0 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
33f00 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
33f10 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
33f20 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
33f30 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
33f40 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
33f50 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
33f60 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
33f70 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
33f80 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
33f90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33fa0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
33fb0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
33fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33fd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
33fe0 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
33ff0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
34000 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
34010 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
34020 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
34030 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
34040 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
34050 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
34060 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
34070 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
34080 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
34090 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
340a0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
340b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
340c0 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
340d0 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
340e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
340f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
34100 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
34110 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
34120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
34130 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
34140 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
34150 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
34160 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50  empFile==0 && pP
34170 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
34180 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
34190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
341a0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
341b0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
341c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
341d0 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
341e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
341f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
34200 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
34210 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
34220 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
34230 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
34240 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
34250 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
34260 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
34270 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50  R_READER;.    pP
34280 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
34290 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d  redLock = 1;.  }
342a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
342b0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
342c0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
342d0 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
342e0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
342f0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
34300 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
34310 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
34320 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
34330 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
34340 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
34350 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
34360 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
34370 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
34380 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
34390 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
343a0 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
343b0 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
343c0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
343d0 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
343e0 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
343f0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
34400 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
34410 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30  ger->nMmapOut==0
34420 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61 63   && (sqlite3Pcac
34430 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
34440 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
34450 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
34460 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
34470 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
34480 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  .** The page get
34490 74 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68  ter methods each
344a0 20 74 72 79 20 74 6f 20 61 63 71 75 69 72 65 20   try to acquire 
344b0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
344c0 0a 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70 61  .** page with pa
344d0 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
344e0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
344f0 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
34500 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
34510 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
34520 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
34530 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
34540 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
34550 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
34560 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
34570 6e 73 20 6f 66 20 74 68 65 20 67 65 74 74 65 72  ns of the getter
34580 20 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e   method dependin
34590 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72  g.** on the curr
345a0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
345b0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   pager..**.**   
345c0 20 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28    getPageNormal(
345d0 29 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68  )         --  Th
345e0 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a  e normal getter.
345f0 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 45 72  **     getPageEr
34600 72 6f 72 28 29 20 20 20 20 20 20 20 20 20 20 2d  ror()          -
34610 2d 20 20 55 73 65 64 20 69 66 20 74 68 65 20 70  -  Used if the p
34620 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
34630 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  ror state.**    
34640 20 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20   getPageMmap()  
34650 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65           --  Use
34660 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  d if memory-mapp
34670 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65  ed I/O is enable
34680 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  d.**.** If the r
34690 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
346a0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
346b0 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
346c0 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
346d0 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
346e0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
346f0 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
34700 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
34710 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
34720 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
34730 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
34740 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
34750 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
34760 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
34770 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
34780 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
34790 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
347a0 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
347b0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
347c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
347d0 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
347e0 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
347f0 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
34800 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
34810 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
34820 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
34830 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
34840 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
34850 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
34860 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
34870 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34880 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
34890 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
348a0 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
348b0 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
348c0 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
348d0 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
348e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
348f0 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
34900 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
34910 20 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20   page or if .** 
34920 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
34930 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ter contains the
34940 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
34950 54 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65  TENT bit and the
34960 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
34970 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
34980 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
34990 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
349a0 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
349b0 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
349c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
349d0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
349e0 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
349f0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
34a00 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
34a10 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  f PAGER_GET_NOCO
34a20 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69  NTENT is true, i
34a30 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
34a40 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
34a50 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
34a60 73 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  s of the page. T
34a70 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
34a80 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
34a90 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
34aa0 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
34ab0 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
34ac0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
34ad0 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
34ae0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
34af0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
34b00 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
34b10 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
34b20 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
34b30 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
34b40 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
34b50 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
34b60 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
34b70 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
34b80 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f  ** If PAGER_GET_
34b90 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75  NOCONTENT is tru
34ba0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
34bb0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
34bc0 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  oed instead.** o
34bd0 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
34be0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
34bf0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
34c00 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
34c10 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
34c20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
34c30 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
34c40 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
34c50 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
34c60 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
34c70 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
34c80 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
34c90 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
34ca0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
34cb0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
34cc0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
34cd0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
34ce0 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
34cf0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
34d00 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
34d10 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
34d20 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
34d30 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
34d40 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
34d50 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
34d60 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
34d70 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
34d80 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
34d90 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
34da0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
34db0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
34dc0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
34dd0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
34de0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
34df0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
34e00 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
34e10 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
34e20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
34e30 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
34e40 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
34e50 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
34e60 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
34e70 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34e80 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
34e90 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
34ea0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
34eb0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
34ec0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
34ed0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
34ee0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
34ef0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
34f00 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
34f10 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
34f20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
34f30 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
34f40 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
34f50 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
34f60 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
34f70 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
34f80 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
34f90 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
34fa0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
34fb0 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iles..*/.static 
34fc0 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  int getPageNorma
34fd0 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  l(.  Pager *pPag
34fe0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
34ff0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
35000 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35010 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
35020 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35030 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
35040 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
35050 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
35060 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
35070 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
35080 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
35090 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
350a0 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
350b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
350c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
350d0 72 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43  r *pPg;.  u8 noC
350e0 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
350f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
35100 65 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  e if PAGER_GET_N
35110 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20  OCONTENT is set 
35120 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  */.  sqlite3_pca
35130 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b  che_page *pBase;
35140 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
35150 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
35160 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
35170 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35180 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
35190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
351a0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
351b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
351c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61  sert( pPager->ha
351d0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d  sHeldSharedLock=
351e0 3d 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =1 );..#ifndef S
351f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
35200 52 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68  RRENT.  /* If th
35210 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52  is is an CONCURR
35220 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ENT transaction 
35230 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 69  and the page bei
35240 6e 67 20 72 65 61 64 20 77 61 73 0a 20 20 2a 2a  ng read was.  **
35250 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
35260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
35270 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
35280 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a 20  on was opened,. 
35290 20 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73 20 72   ** mark it as r
352a0 65 61 64 20 69 6e 20 74 68 65 20 70 41 6c 6c 52  ead in the pAllR
352b0 65 61 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a  ead vector.  */.
352c0 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 69 66 28    pPg = 0;.  if(
352d0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
352e0 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65  d && pgno<=pPage
352f0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
35300 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
35310 28 22 55 53 49 4e 47 20 70 61 67 65 20 25 64 5c  ("USING page %d\
35320 6e 22 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  n", pgno));.    
35330 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
35340 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41  ecSet(pPager->pA
35350 6c 6c 52 65 61 64 2c 20 70 67 6e 6f 29 3b 0a 20  llRead, pgno);. 
35360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35370 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
35380 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
35390 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
353a0 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72   pgno==0 ) retur
353b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
353c0 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d  _BKPT;.  pBase =
353d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
353e0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
353f0 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
35400 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
35410 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
35420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
35430 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28  acheFetchStress(
35440 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
35450 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a   pgno, &pBase);.
35460 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35470 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
35480 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35490 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
354a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
354b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
354c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
354d0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
354e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20      }.  }.  pPg 
354f0 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
35500 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
35510 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
35520 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
35530 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
35540 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a  g==(*ppPage) );.
35550 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35560 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
35570 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
35580 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
35590 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
355a0 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  .  noContent = (
355b0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
355c0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b  T_NOCONTENT)!=0;
355d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
355e0 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
355f0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
35600 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
35610 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
35620 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
35630 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
35640 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
35650 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
35660 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
35670 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
35680 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
35690 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
356a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
356b0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
356c0 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
356d0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
356e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
356f0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
35700 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
35710 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
35720 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
35730 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
35740 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
35750 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65  But first some e
35760 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20  rror checks:.   
35770 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54   **.    ** (1) T
35780 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
35790 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20  number is 2^31. 
357a0 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20     ** (2) Never 
357b0 74 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65  try to fetch the
357c0 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20   locking page.  
357d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
357e0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
357f0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
35800 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
35810 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35820 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35830 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
35840 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
35860 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
35870 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ;..    assert( !
35880 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
35890 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  d) || !MEMDB );.
358a0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
358b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
358c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
358d0 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
358e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
358f0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
35900 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35910 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
35920 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
35930 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
35940 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35950 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
35960 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
35970 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
35980 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
35990 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
359a0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
359b0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
359c0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
359d0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
359e0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
359f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
35a00 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
35a10 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
35a20 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
35a30 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
35a40 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
35a50 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
35a60 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
35a70 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
35a80 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
35a90 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
35aa0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
35ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35ac0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
35ad0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
35ae0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
35af0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
35b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
35b10 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
35b20 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
35b30 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35b40 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
35b50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35b60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35b70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35b80 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
35b90 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
35ba0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
35bb0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
35bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
35bd0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
35be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35bf0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
35c00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35c10 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
35c20 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
35c30 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
35c40 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
35c50 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
35c60 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
35c70 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69 46  se{.      u32 iF
35c80 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
35c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
35ca0 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
35cb0 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  WAL file */.    
35cc0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
35cd0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
35ce0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35cf0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
35d00 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
35d10 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
35d20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35d30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
35d40 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
35d60 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
35d70 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
35d80 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
35d90 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53  [PAGER_STAT_MISS
35da0 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ]++;.      rc = 
35db0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
35dc0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
35dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35de0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
35df0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35e00 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
35e10 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
35e20 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20  pagehash(pPg);. 
35e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
35e40 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
35e50 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
35e60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
35e70 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
35e80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
35e90 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
35ea0 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
35eb0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
35ec0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
35ed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35ee0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
35ef0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54  MMAP_SIZE>0./* T
35f00 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20 66  he page getter f
35f10 6f 72 20 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d  or when memory-m
35f20 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e 61  apped I/O is ena
35f30 62 6c 65 64 20 2a 2f 0a 73 74 61 74 69 63 20 69  bled */.static i
35f40 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28 0a  nt getPageMMap(.
35f50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
35f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
35f70 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
35f80 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
35f90 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
35fa0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
35fb0 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
35fc0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
35fd0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
35fe0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35ff0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
36000 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
36010 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
36020 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
36030 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36040 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
36050 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
36060 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
36070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
36080 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
36090 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20   WAL file */..  
360a0 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74 61  /* It is accepta
360b0 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65 61  ble to use a rea
360c0 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61  d-only (mmap) pa
360d0 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  ge for any page 
360e0 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65  except.  ** page
360f0 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e   1 if there is n
36100 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
36110 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20  ion open or the 
36120 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
36130 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73  .  ** flag was s
36140 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
36150 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c  caller. And so l
36160 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69 73  ong as the db is
36170 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d   not a .  ** tem
36180 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
36190 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a  ory database.  *
361a0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d  /.  const int bM
361b0 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a  mapOk = (pgno>1.
361c0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
361d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
361e0 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DER || (flags & 
361f0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
36200 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73  LY)).  );..  ass
36210 65 72 74 28 20 55 53 45 46 45 54 43 48 28 70 50  ert( USEFETCH(pP
36220 61 67 65 72 29 20 29 3b 0a 23 69 66 64 65 66 20  ager) );.#ifdef 
36230 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
36240 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36250 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a  r->xCodec==0 );.
36260 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74  #endif..  /* Opt
36270 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  imization note: 
36280 20 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e   Adding the "pgn
36290 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72  o<=1" term befor
362a0 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65  e "pgno==0" here
362b0 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65  .  ** allows the
362c0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
362d0 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65  zer to reuse the
362e0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
362f0 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65  "pgno>1".  ** te
36300 73 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  st in the previo
36310 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e  us statement, an
36320 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20  d avoid testing 
36330 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20  pgno==0 in the. 
36340 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20   ** common case 
36350 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61  where pgno is la
36360 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67  rge. */.  if( pg
36370 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30  no<=1 && pgno==0
36380 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
36390 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
363a0 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
363b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
363c0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
363d0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
363e0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
363f0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
36400 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48  rt( pPager->hasH
36410 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31  eldSharedLock==1
36420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
36430 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
36440 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
36450 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61  f( bMmapOk && pa
36460 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
36470 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
36480 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
36490 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
364a0 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
364b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
364c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
364d0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
364e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
364f0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d   }.  }.  if( bMm
36500 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d  apOk && iFrame==
36510 30 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  0 ){.    void *p
36520 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 72 63  Data = 0;.    rc
36530 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74 63   = sqlite3OsFetc
36540 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20  h(pPager->fd, . 
36550 20 20 20 20 20 20 20 28 69 36 34 29 28 70 67 6e         (i64)(pgn
36560 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
36570 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
36580 3e 70 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74  >pageSize, &pDat
36590 61 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  a.    );.    if(
365a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
365b0 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  & pData ){.     
365c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
365d0 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52  ate>PAGER_READER
365e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
365f0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
36600 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
36610 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
36620 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   pgno);.      }.
36630 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
36640 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36650 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
36660 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
36670 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b  o, pData, &pPg);
36680 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .     }else{.   
36690 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
366a0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
366b0 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a  , (i64)(pgno-1)*
366c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
366d0 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
366e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 20  }.      if( pPg 
366f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
36700 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
36710 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
36720 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  age = pPg;.     
36730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36740 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
36750 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
36760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36770 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
36780 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36790 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
367a0 72 6e 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c  rn getPageNormal
367b0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
367c0 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d  pPage, flags);.}
367d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
367e0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
367f0 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65 20 70 61 67  0 */../* The pag
36800 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20  e getter method 
36810 66 6f 72 20 77 68 65 6e 20 74 68 65 20 70 61 67  for when the pag
36820 65 72 20 69 73 20 61 6e 20 65 72 72 6f 72 20 73  er is an error s
36830 74 61 74 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  tate */.static i
36840 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28  nt getPageError(
36850 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36860 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
36870 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
36880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
36890 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
368a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
368b0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
368c0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
368d0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
368e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
368f0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
36900 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
36910 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
36920 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
36930 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
36940 45 54 45 52 28 70 67 6e 6f 29 3b 0a 20 20 55 4e  ETER(pgno);.  UN
36950 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
36960 6c 61 67 73 29 3b 0a 20 20 61 73 73 65 72 74 28  lags);.  assert(
36970 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36980 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
36990 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
369a0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
369b0 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44  rrCode;.}.../* D
369c0 69 73 70 61 74 63 68 20 61 6c 6c 20 70 61 67 65  ispatch all page
369d0 20 66 65 74 63 68 20 72 65 71 75 65 73 74 73 20   fetch requests 
369e0 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
369f0 74 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  te getter method
36a00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36a10 50 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65  PagerGet(.  Page
36a20 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
36a30 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
36a40 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
36a50 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
36a60 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
36a70 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
36a80 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
36a90 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
36aa0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
36ab0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
36ac0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
36ad0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
36ae0 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
36af0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 72 65 74  lags */.){.  ret
36b00 75 72 6e 20 70 50 61 67 65 72 2d 3e 78 47 65 74  urn pPager->xGet
36b10 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
36b20 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d  pPage, flags);.}
36b30 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
36b40 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
36b50 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
36b60 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
36b70 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
36b80 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
36b90 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
36ba0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
36bb0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
36bc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
36bd0 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53   cache. .**.** S
36be0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
36bf0 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
36c00 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
36c10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
36c20 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
36c30 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
36c40 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
36c50 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
36c60 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
36c70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
36c80 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
36c90 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
36ca0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
36cb0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
36cc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
36cd0 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
36ce0 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
36cf0 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
36d00 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
36d10 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
36d20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
36d30 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69  no pgno){.  sqli
36d40 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
36d50 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
36d60 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
36d70 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
36d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
36d90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
36da0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71   );.  pPage = sq
36db0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
36dc0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
36dd0 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73  , pgno, 0);.  as
36de0 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c  sert( pPage==0 |
36df0 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  | pPager->hasHel
36e00 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20  dSharedLock );. 
36e10 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20   if( pPage==0 ) 
36e20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
36e30 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
36e40 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
36e50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
36e60 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  o, pPage);.}../*
36e70 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
36e80 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
36e90 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
36ea0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
36eb0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
36ec0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
36ed0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
36ee0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
36ef0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
36f00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
36f10 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
36f20 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
36f30 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
36f40 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
36f50 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
36f60 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
36f70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
36f80 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70  otNull(DbPage *p
36f90 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36fa0 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
36fb0 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  pPg!=0 );.  pPag
36fc0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
36fd0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  ;.  if( pPg->fla
36fe0 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
36ff0 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65  ){.    pagerRele
37000 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b  aseMapPage(pPg);
37010 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
37020 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
37030 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  se(pPg);.  }.  p
37040 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
37050 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f  ed(pPager);.}.vo
37060 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
37070 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
37080 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73  ){.  if( pPg ) s
37090 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
370a0 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a  NotNull(pPg);.}.
370b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
370c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
370d0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
370e0 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
370f0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
37100 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
37110 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
37120 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
37130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
37140 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
37150 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
37160 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
37170 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37180 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
37190 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
371a0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
371b0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
371c0 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
371d0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
371e0 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
371f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
37200 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
37210 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
37220 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
37230 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
37240 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
37250 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
37260 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
37270 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
37280 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
37290 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
372a0 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
372b0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
372c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
372d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
372e0 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
372f0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
37300 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
37310 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
37320 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
37330 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
37340 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
37350 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
37360 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
37370 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
37380 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
37390 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
373a0 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
373b0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
373c0 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
373d0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
373e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
373f0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
37400 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
37410 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
37420 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
37430 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
37440 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
37450 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
37460 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
37470 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
37480 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
37490 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
374a0 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
374b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
374c0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
374d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
374e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
374f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37500 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
37510 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
37520 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
37530 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
37540 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
37550 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
37560 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
37570 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37580 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37590 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
375a0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
375b0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
375c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
375d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
375e0 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
375f0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
37600 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
37610 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
37620 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
37630 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
37640 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
37650 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
37660 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
37670 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
37680 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
37690 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
376a0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
376b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
376c0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
376d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
376e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
376f0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
37700 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
37710 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
37720 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
37730 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
37740 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
37750 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37760 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
37770 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
37780 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
37790 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
377a0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
377b0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
377c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
377d0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
377e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
377f0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
37800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37810 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37820 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
37830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
37840 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
37850 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
37860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37870 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
37880 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
37890 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
378a0 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69  REATE;.        i
378b0 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20  nt nSpill;..    
378c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
378d0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
378e0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
378f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
37900 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
37910 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
37920 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  AL);.          n
37930 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
37940 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
37950 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
37960 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
37970 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
37980 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
37990 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
379a0 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
379b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
379c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20   }.          .  
379d0 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
379e0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
379f0 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20  e still has the 
37a00 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20  same name as it 
37a10 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20  did when.       
37a20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69   ** it was origi
37a30 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  nally opened. */
37a40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61  .        rc = da
37a50 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
37a60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
37a70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37a80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37a90 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
37aa0 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20  nalOpen (.      
37ab0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
37ac0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
37ad0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
37ae0 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20  gs, nSpill.     
37af0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
37b00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
37b10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
37b20 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
37b30 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
37b40 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
37b50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
37b60 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
37b70 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
37b80 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
37b90 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
37ba0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
37bb0 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
37bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37bd0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
37be0 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
37bf0 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
37c00 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
37c10 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
37c20 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
37c30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37c40 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
37c50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
37c60 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
37c70 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
37c80 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
37c90 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
37ca0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
37cb0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
37cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
37cd0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
37ce0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
37cf0 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
37d00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
37d10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
37d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37d30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37d40 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
37d50 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
37d60 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
37d70 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
37d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37d90 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
37da0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
37db0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
37dc0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
37dd0 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
37de0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
37df0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
37e00 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
37e10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
37e20 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
37e30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 30 2c 20   argument is 0, 
37e40 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
37e50 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
37e60 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
37e70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
37e80 66 20 65 78 46 6c 61 67 20 69 73 20 3e 30 2c 20  f exFlag is >0, 
37e90 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
37ea0 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
37eb0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
37ec0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
37ed0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
37ee0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
37ef0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
37f00 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 28 65  led..**.** If (e
37f10 78 46 6c 61 67 3c 30 29 20 61 6e 64 20 74 68 65  xFlag<0) and the
37f20 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
37f30 57 41 4c 20 6d 6f 64 65 2c 20 64 6f 20 6e 6f 74  WAL mode, do not
37f40 20 74 61 6b 65 20 61 6e 79 20 6c 6f 63 6b 73 2e   take any locks.
37f50 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74  .** The transact
37f60 69 6f 6e 20 77 69 6c 6c 20 72 75 6e 20 69 6e 20  ion will run in 
37f70 43 4f 4e 43 55 52 52 45 4e 54 20 6d 6f 64 65 20  CONCURRENT mode 
37f80 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
37f90 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
37fa0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
37fb0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
37fc0 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
37fd0 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
37fe0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
37ff0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
38000 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
38010 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
38020 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
38030 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
38040 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
38050 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
38060 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
38070 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
38080 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
38090 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
380a0 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
380b0 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
380c0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
380d0 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
380e0 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
380f0 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
38100 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
38110 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
38120 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
38130 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
38140 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
38150 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
38160 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
38170 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
38180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
38190 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
381a0 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
381b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
381c0 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
381d0 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
381e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
381f0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
38200 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
38210 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
38220 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
38230 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70  GER_ERROR );.  p
38240 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
38250 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
38260 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41  Memory;..  if( A
38270 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53  LWAYS(pPager->eS
38280 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
38290 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ER) ){.    asser
382a0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
382b0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
382c0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
382d0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
382e0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
382f0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
38300 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
38310 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
38320 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
38330 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
38340 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
38350 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
38360 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
38370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
38380 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
38390 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
383a0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
383b0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
383c0 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
383d0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
383e0 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
383f0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
38400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
38410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
38420 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
38430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
38440 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c  (void)sqlite3Wal
38450 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
38460 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
38470 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
38480 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
38490 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
384a0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
384b0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
384c0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
384d0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
384e0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
384f0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
38500 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
38510 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
38520 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
38530 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
38540 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
38550 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
38560 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
38570 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
38580 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
38590 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 20  r will call it. 
385a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 65 78   */.      if( ex
385b0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Flag>=0 ){.     
385c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
385d0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
385e0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
385f0 70 57 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pWal);.      }. 
38600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38610 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
38620 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
38630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
38640 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
38650 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
38660 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
38670 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
38680 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
38690 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
386a0 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
386b0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
386c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
386d0 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f