/ Hex Artifact Content
Login

Artifact bc2d2b6784cc2b5103e07aff13b012dab30c7efa0abb9bc2bb949ec45cba4326:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9650: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9660: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9670: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
9680: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9690: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
96a0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
96b0: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
96c0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
96d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
96e0: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
96f0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9700: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9710: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9720: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9730: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9740: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
9750: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
9760: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
9770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9790: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
97a0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
97b0: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
97c0: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
97d0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
97e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
97f0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9800: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9810: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9820: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9830: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9840: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
9850: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9860: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
9870: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
9880: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9890: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
98a0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
98b0: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
98c0: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
98d0: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
98e0: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
98f0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9900: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9910: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9920: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9930: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9940: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9950: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9960: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9970: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9980: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9990: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
99a0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
99b0: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
99c0: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
99d0: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
99e0: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
99f0: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9a00: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9a10: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9a40: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9a50: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9a60: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9a70: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a80: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9a90: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9aa0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9ab0: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9ac0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ad0: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9ae0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9af0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9b00: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9b10: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9b20: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9b30: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9b40: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9b50: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9b60: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9b70: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9b80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9b90: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9ba0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9bb0: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9bc0: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9bd0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9be0: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9c00: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9c10: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9c20: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9c30: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9c40: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9c50: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9c60: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9c70: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9c80: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9c90: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9ca0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9cb0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9cc0: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9ce0: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9cf0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9d00: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9d10: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9d20: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9d30: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9d40: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9d50: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9d60: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9d70: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9d80: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9d90: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9da0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9db0: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9dc0: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9dd0: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9de0: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9df0: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9e00: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9e10: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9e20: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9e30: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9e40: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9e50: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9e60: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9e70: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9e80: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9e90: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ea0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
9eb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9ec0: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
9ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9ee0: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
9ef0: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
9f00: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
9f10: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
9f20: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
9f30: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
9f40: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
9f50: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
9f60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
9f70: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
9f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f90: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9fa0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9fb0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9fc0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9fd0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9fe0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ff0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a000: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a010: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a020: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a030: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a040: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a050: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a060: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a070: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a080: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a090: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a0a0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a0b0: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a0c0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a0d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0e0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a0f0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a100: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a110: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a120: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a130: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a140: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a150: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a160: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a170: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a190: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a1a0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a1b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a1c0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a1d0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a1e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a1f0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a220: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a230: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a240: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a250: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a260: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a270: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a280: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a290: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a2a0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a2b0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a2c0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a2d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a2e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a300: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a310: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a320: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a330: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a350: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a360: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a390: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a3a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3b0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a3c0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a3d0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a3e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a3f0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a400: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a410: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a420: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a430: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a440: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a450: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a460: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a470: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a480: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a490: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a4b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a4c0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a4d0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a4e0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a4f0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a500: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a510: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a520: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a530: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a540: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a550: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a560: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a570: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a580: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a590: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a5a0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a5b0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a5c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a5d0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a5f0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a600: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a610: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a620: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a630: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a640: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a650: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a670: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a680: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a690: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20  E_WAL .         
a6a0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a6b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a6c0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20  RNALMODE_WAL2.  
a6d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a6e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a6f0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a700: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a710: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a720: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a730: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a740: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a750: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a760: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a770: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a780: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a790: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a7a0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a7b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a7c0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a7d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a7e0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a7f0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a800: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a810: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a820: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a830: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a840: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a850: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a860: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a870: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a880: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a890: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a8a0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a8b0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a8c0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a8d0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20  URNALMODE_WAL2. 
a8e0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
a8f0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
a900: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
a910: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
a920: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
a930: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a950: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a960: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a980: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a990: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a9b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a9c0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a9d0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a9e0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a9f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
aa00: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
aa10: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
aa20: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
aa30: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
aa40: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
aa70: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
aa80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aa90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aaa0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
aab0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aac0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aad0: 45 5f 57 41 4c 32 0a 20 20 20 20 20 20 20 20 20  E_WAL2.         
aae0: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
aaf0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
ab00: 74 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49  tics(p->fd)&SQLI
ab10: 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41  TE_IOCAP_BATCH_A
ab20: 54 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a  TOMIC).      );.
ab30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ab40: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
ab50: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
ab60: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
ab70: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
ab80: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
ab90: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
aba0: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
abb0: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
abc0: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
abd0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
abe0: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
abf0: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
ac00: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
ac10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ac20: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
ac30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
ac40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
ac50: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
ac60: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
ac70: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
ac80: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
ac90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
aca0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
acb0: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
acc0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
acd0: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
ace0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
acf0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
ad00: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
ad10: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
ad20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
ad30: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
ad40: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
ad50: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
ad60: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
ad70: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
ad80: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
ad90: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
ada0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
adb0: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
adc0: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
add0: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
ade0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
adf0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
ae00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
ae10: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
ae20: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
ae30: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
ae40: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
ae50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
ae60: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
ae70: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
ae80: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
ae90: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aea0: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aeb0: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aec0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aed0: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aee0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aef0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
af00: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
af10: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
af20: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
af30: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
af40: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
af50: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
af60: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
af70: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
af80: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
af90: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
afa0: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
afb0: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
afc0: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
afd0: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
afe0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
aff0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
b000: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
b010: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
b020: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
b030: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
b040: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
b050: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b060: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
b070: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
b080: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
b090: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b0a0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
b0b0: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
b0c0: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
b0d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b0e0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
b0f0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
b100: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b110: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
b120: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
b130: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
b140: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b150: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
b160: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
b170: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
b180: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b190: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
b1a0: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
b1b0: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
b1c0: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
b1d0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
b1e0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
b1f0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
b200: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
b210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
b220: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
b230: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
b240: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
b250: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
b260: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
b270: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
b280: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
b290: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
b2a0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
b2b0: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
b2c0: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
b2d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b2e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b2f0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
b300: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
b310: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b320: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b330: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
b340: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
b350: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b360: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
b370: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
b380: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b390: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b3a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b3b0: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b3c0: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b3f0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b400: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b410: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b420: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b430: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b440: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b450: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b460: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b470: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b480: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b490: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b4a0: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b4b0: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b4c0: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b4d0: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b4e0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b4f0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b500: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b510: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
b520: 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f  ces to the vario
b530: 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20  us page getters 
b540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b550: 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65  tPageNormal(Page
b560: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b570: 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  ,int);.static in
b580: 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50  t getPageError(P
b590: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b5a0: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51  e**,int);.#if SQ
b5b0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b5c0: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
b5d0: 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65  getPageMMap(Page
b5e0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b5f0: 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ,int);.#endif../
b600: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67  *.** Set the Pag
b610: 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66  er.xGet method f
b620: 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  or the appropria
b630: 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  te routine used 
b640: 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74  to fetch.** cont
b650: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b660: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b670: 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  id setGetterMeth
b680: 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  od(Pager *pPager
b690: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b6a0: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b6b0: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b6c0: 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66  etPageError;.#if
b6d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b6e0: 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20  _SIZE>0.  }else 
b6f0: 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
b700: 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49  ger).#ifdef SQLI
b710: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
b720: 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
b730: 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b  c==0.#endif.  ){
b740: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
b750: 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b  t = getPageMMap;
b760: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b770: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b780: 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 */.  }else{.  
b790: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b7a0: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a   getPageNormal;.
b7b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
b7c0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b7d0: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b7e0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b7f0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b800: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b810: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b820: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b830: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b840: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b850: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b860: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b870: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b880: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b890: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b8a0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b8b0: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b8c0: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b8d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b8e0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b8f0: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b900: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b910: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b930: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b940: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b950: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b960: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b980: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b990: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b9a0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b9b0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b9c0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b9d0: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b9e0: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b9f0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
ba00: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
ba10: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
ba20: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
ba30: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
ba40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ba50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ba60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ba70: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
ba80: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
ba90: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
baa0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
bab0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
bac0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
bad0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bae0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
baf0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
bb00: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
bb10: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
bb20: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
bb30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
bb40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
bb50: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
bb60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
bb70: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
bb80: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
bb90: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
bba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bbb0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
bbc0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
bbd0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
bbe0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
bbf0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
bc00: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
bc10: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
bc20: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
bc30: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
bc40: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
bc50: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
bc60: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
bc70: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
bc80: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
bc90: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
bca0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
bcb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bcc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
bcd0: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
bce0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
bcf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bd00: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bd10: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bd20: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
bd30: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
bd40: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
bd50: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
bd60: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
bd70: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
bd80: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
bd90: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
bda0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
bdb0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
bdc0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bdd0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
bde0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
bdf0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
be00: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
be10: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
be20: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
be30: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
be40: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
be50: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
be60: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
be70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
be80: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
be90: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
bea0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
beb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
bec0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
bed0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
bee0: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
bef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
bf00: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
bf10: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
bf20: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
bf30: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
bf40: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
bf50: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
bf60: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
bf70: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
bf80: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
bf90: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
bfa0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
bfb0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
bfc0: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
bfd0: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
bfe0: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
bff0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
c000: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
c010: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c020: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
c030: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
c040: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
c050: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c060: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c070: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c080: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
c090: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c0a0: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
c0b0: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
c0c0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
c0d0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
c0e0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c0f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
c100: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
c110: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c120: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
c130: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c140: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c150: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
c160: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
c170: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c180: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c190: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
c1a0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c1b0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c1c0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c1d0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
c1e0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
c1f0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
c200: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c210: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
c220: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c240: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
c250: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c260: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c270: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c280: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
c290: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
c2a0: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
c2b0: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
c2c0: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
c2d0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
c2e0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
c2f0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
c300: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
c310: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
c320: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
c330: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
c340: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
c350: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
c360: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
c370: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
c380: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c390: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
c3a0: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
c3b0: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
c3c0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
c3d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
c3e0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
c3f0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
c400: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
c410: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c420: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c430: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c440: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c450: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
c460: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
c470: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
c480: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
c490: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
c4a0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
c4b0: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
c4c0: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
c4d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
c4e0: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
c4f0: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
c500: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
c510: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c520: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c530: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
c540: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
c550: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
c560: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
c570: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c580: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c590: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
c5a0: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
c5b0: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
c5c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c5d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
c5e0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
c5f0: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
c600: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
c610: 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d  write or.** atom
c620: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c630: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
c640: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c650: 69 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a  is pager. The.**
c660: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
c670: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c680: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c690: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c6a0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c6b0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c6c0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
c6d0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
c6e0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
c6f0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
c700: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c710: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c720: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c730: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c740: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c750: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c760: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
c770: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
c780: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
c790: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
c7a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c7b0: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68  rnal .** file wh
c7c0: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72  en it contains r
c7d0: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
c7e0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
c7f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f  e..**.** The ato
c800: 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20  mic-batch-write 
c810: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c820: 20 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65   be used if OsDe
c830: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c840: 69 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  ics().** returns
c850: 20 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68   a value with th
c860: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  e SQLITE_IOCAP_B
c870: 41 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20  ATCH_ATOMIC bit 
c880: 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65  set. -1 is.** re
c890: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
c8a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ase..**.** If ne
c8b0: 69 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  ither optimizati
c8c0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
c8d0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
c8e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  /.static int jrn
c8f0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c900: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c910: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c920: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
c930: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
c940: 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64  C_WRITE) \. || d
c950: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
c960: 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
c970: 43 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64  C_WRITE).  int d
c980: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9a0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
c9b0: 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
c9c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
c9d0: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20  er->fd) );.  dc 
c9e0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
c9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ca00: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65  (pPager->fd);.#e
ca10: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
ca20: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
ca30: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
ca40: 69 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49 4f  if( dc&SQLITE_IO
ca50: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ca60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
ca70: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  1;.  }.#endif..#
ca80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ca90: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
caa0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 65  .  {.    int nSe
cab0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
cac0: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 69  ectorSize;.    i
cad0: 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
cae0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
caf0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
cb00: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
cb10: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
cb20: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
cb30: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
cb40: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
cb50: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
cb60: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
cb70: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
cb80: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
cb90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cba0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
cbb0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
cbc0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
cbd0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
cbe0: 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  Pager);.#endif..
cbf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
cc00: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
cc10: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
cc20: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
cc30: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
cc40: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
cc50: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
cc60: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
cc70: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
cc80: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
cc90: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
cca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
ccb0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
ccc0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
ccd0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
cce0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
ccf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
cd00: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
cd10: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
cd20: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
cd30: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
cd40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
cd50: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
cd60: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
cd70: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
cd80: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
cd90: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
cda0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
cdb0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
cdc0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
cdd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
cde0: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
cdf0: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
ce00: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
ce10: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
ce20: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
ce30: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
ce40: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
ce50: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
ce60: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
ce70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
ce80: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
ce90: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
cea0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
ceb0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
cec0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
ced0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
cee0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
cef0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
cf00: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
cf10: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
cf20: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
cf30: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
cf40: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
cf50: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
cf60: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
cf70: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
cf80: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
cf90: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
cfa0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
cfb0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
cfc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cfd0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
cfe0: 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
cff0: 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
d000: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
d010: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
d020: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
d030: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
d040: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
d050: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
d060: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
d070: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
d080: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
d090: 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43  ash(X).#define C
d0a0: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
d0b0: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
d0c0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
d0d0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
d0e0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
d100: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
d110: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73  be open..** This
d120: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
d130: 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73  ts to read a mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d150: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a   name from the .
d160: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
d170: 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65  le and, if succe
d180: 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74  ssful, copies it
d190: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
d1a0: 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65  plied .** by the
d1b0: 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d   caller. See com
d1c0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74  ments above writ
d1d0: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
d1e0: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a   for the format.
d1f0: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
d200: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d210: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74  l file name at t
d220: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
d230: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
d240: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
d250: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
d260: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
d270: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
d280: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
d290: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
d2a0: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
d2b0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
d2c0: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
d2d0: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
d2e0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
d2f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d300: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
d310: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
d320: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
d330: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
d340: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
d350: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
d360: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
d370: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
d380: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
d390: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d3a0: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
d3b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
d3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74  .**.** If a mast
d3d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d3e0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
d3f0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d400: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
d410: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  e, then it is co
d420: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75  pied into the bu
d430: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
d440: 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a  by zMaster. A.**
d450: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
d460: 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64  byte is appended
d470: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66   to the buffer f
d480: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73  ollowing the mas
d490: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
d4a0: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
d4b0: 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69  If it is determi
d4c0: 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74  ned that no mast
d4d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d4e0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
d4f0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  .** zMaster[0] i
d500: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
d510: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
d520: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
d530: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
d540: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
d550: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
d560: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
d570: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
d580: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
d590: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
d5a0: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
d5b0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
d5c0: 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d  *zMaster, u32 nM
d5d0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
d5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5f0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
d600: 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  ode */.  u32 len
d610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d620: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e      /* Length in
d630: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
d640: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
d650: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d670: 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62   Total size in b
d680: 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ytes of journal 
d690: 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20  file pJrnl */.  
d6a0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
d6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a             /* MJ
d6c0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
d6d0: 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  read from journa
d6e0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
d710: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d720: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
d730: 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20  agic[8];   /* A 
d740: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
d750: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
d760: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  */.  zMaster[0] 
d770: 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53  = '\0';..  if( S
d780: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d790: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
d7a0: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a  e(pJrnl, &szJ)).
d7b0: 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20     || szJ<16.   
d7c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d7d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d7e0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
d7f0: 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d  en)).   || len>=
d800: 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c  nMaster .   || l
d810: 65 6e 3e 73 7a 4a 2d 31 36 0a 20 20 20 7c 7c 20  en>szJ-16.   || 
d820: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d830: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d840: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d850: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d860: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d870: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d880: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d890: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d8a0: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d8b0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d8c0: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d8d0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d8e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d8f0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d900: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d910: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d920: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d930: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d940: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d950: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d960: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d970: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d980: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d990: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d9a0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d9b0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d9c0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d9d0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d9e0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d9f0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
da00: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
da10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
da20: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
da30: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
da40: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
da50: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
da60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da70: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
da80: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
da90: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
daa0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
dab0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
dac0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
dad0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
dae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
daf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
db00: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
db10: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
db20: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
db30: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
db40: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
db50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
db60: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
db70: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
db80: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
db90: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
dba0: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
dbb0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
dbc0: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
dbd0: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
dbe0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
dbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc10: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
dc60: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
dc70: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
dc80: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
dca0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
dcb0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
dcc0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
dcd0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
dce0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
dcf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dd00: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
dd10: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
dd20: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
dd30: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
dd40: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
dd50: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
dd60: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
dd70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd80: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
dd90: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
dda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
ddb0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
ddc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
ddd0: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
dde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ddf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
de00: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
de10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
de20: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
de30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
de40: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
de50: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
de60: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
de70: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
de80: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
de90: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
dea0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
deb0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
dec0: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
ded0: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
dee0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
def0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
df00: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
df10: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
df20: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
df30: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
df40: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
df50: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
df60: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
df70: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
df80: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
df90: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
dfa0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
dfb0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
dfc0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
dfd0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
dfe0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
dff0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
e000: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
e010: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
e020: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
e030: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
e040: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
e050: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
e060: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
e070: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
e080: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
e090: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
e0a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
e0b0: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
e0c0: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
e0d0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
e0e0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
e0f0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
e100: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
e110: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
e120: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
e130: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
e140: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
e150: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
e160: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
e170: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
e180: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
e190: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
e1a0: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
e1b0: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
e1c0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
e1d0: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
e1e0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e1f0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
e200: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
e210: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
e240: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
e250: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
e260: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
e270: 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75  ert( !sqlite3Jou
e280: 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
e290: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
e2a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
e2b0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
e2c0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
e2d0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e2e0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
e2f0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
e300: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
e310: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
e320: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
e330: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
e340: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
e350: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e360: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e370: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
e380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e390: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
e3a0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
e3b0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
e3c0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
e3d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
e3e0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
e3f0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
e400: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
e410: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
e420: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
e430: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e440: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
e450: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
e460: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
e470: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
e480: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
e490: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
e4a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
e4b0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
e4c0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
e4d0: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
e4e0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
e4f0: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
e500: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
e510: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
e520: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
e530: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
e540: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
e550: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
e560: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
e570: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
e580: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
e590: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
e5a0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
e5b0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
e5c0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
e5d0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
e5e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
e5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
e600: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
e610: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
e620: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
e630: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
e640: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
e650: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e660: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
e670: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e680: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e690: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
e6a0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
e6b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e6c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
e6d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
e6e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
e6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e700: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
e710: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
e720: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e730: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
e740: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e750: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
e760: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
e770: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
e780: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
e790: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
e7a0: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
e7b0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
e7c0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
e7d0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
e7e0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
e7f0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
e800: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
e810: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
e820: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
e830: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
e840: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
e850: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
e860: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
e870: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
e880: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
e890: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
e8a0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
e8b0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
e8c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
e8d0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
e8e0: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
e8f0: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
e900: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e910: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e920: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e930: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e940: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e950: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e960: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e970: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e980: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e990: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e9a0: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e9b0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e9c0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e9d0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e9e0: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e9f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
ea00: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
ea10: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
ea20: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
ea30: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea50: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
ea60: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
ea70: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
eaa0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
eab0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
eac0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
ead0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
eae0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
eaf0: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
eb00: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
eb10: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
eb20: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
eb30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
eb40: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
eb50: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
eb60: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
eb70: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
eb80: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
eb90: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
eba0: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
ebb0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
ebc0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
ebd0: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
ebe0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
ebf0: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
ec00: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
ec10: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
ec20: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
ec30: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ec40: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
ec50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
ec60: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
ec70: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
ec80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ec90: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
eca0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
ecb0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
ecd0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
ece0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
ecf0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
ed00: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
ed10: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
ed20: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
ed30: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
ed40: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
ed50: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
ed60: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
ed70: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
ed80: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
ed90: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
eda0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
edb0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
edc0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
edd0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
ede0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
edf0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
ee00: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
ee10: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
ee20: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
ee30: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
ee40: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
ee50: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
ee60: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
ee70: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
ee80: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
ee90: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
eea0: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
eeb0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
eec0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
eed0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
eee0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
eef0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
ef00: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
ef10: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
ef20: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
ef30: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ef40: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
ef50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
ef60: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
ef70: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
ef80: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
ef90: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
efa0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
efb0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
efc0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
efd0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
efe0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
eff0: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
f000: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
f010: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
f020: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
f030: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
f040: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
f050: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
f060: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
f070: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
f080: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
f090: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
f0a0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
f0b0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
f0c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
f0d0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f0e0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
f0f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f100: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f110: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
f120: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
f130: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
f140: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
f150: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
f160: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
f170: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
f180: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
f190: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
f1a0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
f1b0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
f1c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f1d0: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
f1e0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f1f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f200: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
f210: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
f220: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
f230: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
f240: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
f250: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
f260: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
f270: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
f280: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
f290: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
f2a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
f2b0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f2c0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
f2d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f2e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
f2f0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
f300: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
f310: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
f320: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
f330: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f340: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f350: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
f360: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
f370: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
f380: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
f390: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
f3a0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
f3b0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f3c0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
f3d0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
f3e0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
f3f0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
f400: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f410: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f420: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
f430: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
f440: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
f450: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
f460: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
f470: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
f480: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
f490: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
f4a0: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
f4b0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
f4c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
f4d0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
f4e0: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
f4f0: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
f500: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
f510: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
f520: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
f530: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
f540: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
f550: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f560: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
f570: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
f580: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f590: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
f5a0: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
f5b0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
f5c0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
f5d0: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
f5e0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f5f0: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
f600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
f610: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
f620: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
f630: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
f640: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
f650: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
f660: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
f670: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
f680: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
f690: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
f6a0: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
f6b0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
f6c0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
f6d0: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
f6e0: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
f6f0: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
f700: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
f710: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
f720: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
f730: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
f740: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
f750: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
f760: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
f770: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
f780: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
f790: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
f7a0: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
f7b0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
f7c0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
f7d0: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
f7e0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
f7f0: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
f800: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
f810: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
f820: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
f830: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
f840: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
f850: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
f860: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
f870: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
f880: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
f890: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
f8a0: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
f8b0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
f8c0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
f8d0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
f8e0: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
f8f0: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
f900: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f910: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f920: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f930: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f940: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f950: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f960: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f970: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f980: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f990: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f9a0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f9b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f9c0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f9d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f9e0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f9f0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
fa00: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
fa10: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
fa20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
fa30: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
fa40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
fa50: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
fa60: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
fa70: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
fa80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fa90: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
faa0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
fab0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
fac0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
fad0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
fae0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
faf0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
fb00: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
fb10: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
fb20: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
fb30: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
fb40: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
fb50: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
fb60: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
fb70: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
fb80: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
fb90: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
fba0: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
fbb0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
fbc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fbd0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
fbe0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
fbf0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
fc00: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
fc10: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
fc20: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
fc30: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
fc40: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
fc50: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
fc60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
fc70: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
fc80: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
fc90: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
fca0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
fcb0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
fcc0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
fcd0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fce0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
fcf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
fd00: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
fd10: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
fd20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
fd30: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
fd40: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
fd50: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
fd60: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
fd70: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
fd80: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
fd90: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
fda0: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
fdb0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
fdc0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
fdd0: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
fde0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
fdf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
fe00: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
fe10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe30: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
fe40: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
fe50: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fe70: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
fe80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
fe90: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
fea0: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
feb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
fec0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
fed0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
fee0: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
ff10: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
ff20: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
ff30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ff60: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
ff70: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
ff80: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
ff90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
ffa0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
ffb0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ffd0: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
ffe0: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
fff0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
10000 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
10010 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
10020 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
10030 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
10040 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
10050 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
10060 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10070 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
10080 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
10090 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
100a0 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
100b0 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
100c0 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
100d0 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
100e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
100f0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10100 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
10110 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
10120 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10130 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
10140 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
10150 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
10160 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10170 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
10180 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
10190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
101a0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
101b0 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
101c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
101d0 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
101e0 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
101f0 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
10200 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
10210 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
10220 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
10230 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
10240 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
10250 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10260 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10270 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
10280 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
10290 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
102a0 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
102b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
102c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
102d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
102e0 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
102f0 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
10300 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
10310 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10320 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
10330 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
10340 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10350 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
10360 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
10370 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10390 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
103a0 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
103b0 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
103c0 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
103d0 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
103e0 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
103f0 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
10400 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
10410 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
10420 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
10430 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
10440 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
10450 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
10460 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
10470 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10480 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10490 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
104a0 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
104b0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
104c0 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
104d0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
104e0 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
104f0 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
10500 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10510 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10520 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
10530 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
10540 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10550 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
10560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
10570 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
10580 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
10590 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
105a0 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
105b0 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
105c0 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
105d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
105e0 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
105f0 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
10600 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
10610 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
10620 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
10630 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
10640 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
10650 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
10660 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
10670 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10680 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
10690 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
106a0 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
106b0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
106c0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
106d0 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
106e0 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
106f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10700 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
10710 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
10720 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
10730 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
10740 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
10750 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
10760 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
10770 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
10780 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
10790 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
107a0 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
107b0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
107c0 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
107d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
107e0 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
107f0 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
10800 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10810 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
10820 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
10830 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
10840 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10850 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
10860 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
10870 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
10880 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
10890 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
108a0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
108b0 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
108c0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
108d0 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
108e0 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
108f0 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
10900 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10910 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10920 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10930 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10940 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10950 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10960 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
10970 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
10980 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10990 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
109a0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
109b0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
109c0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
109d0 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
109e0 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
109f0 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
10a00 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10a10 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10a20 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10a30 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10a40 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10a50 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10a60 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
10a70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
10a80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
10a90 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
10aa0 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
10ab0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
10ac0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
10ad0 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
10ae0 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
10af0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
10b00 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10b10 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10b20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10b30 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10b40 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10b50 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10b60 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
10b70 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
10b80 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
10b90 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
10ba0 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
10bb0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
10bc0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
10bd0 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
10be0 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
10bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10c00 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10c10 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10c20 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10c30 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10c40 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10c50 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10c60 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
10c70 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10c80 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
10c90 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10ca0 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
10cb0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
10cc0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
10cd0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
10ce0 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
10cf0 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
10d00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10d10 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10d20 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10d30 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10d40 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10d50 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10d60 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
10d70 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10d80 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10d90 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10da0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10db0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
10dc0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10dd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10de0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10df0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10e00 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10e10 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10e20 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10e30 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10e50 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10e60 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
10e70 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10e80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10e90 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10ea0 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
10eb0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
10ec0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10ed0 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10ee0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10f00 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10f10 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10f20 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10f30 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10f40 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10f50 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10f60 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
10f70 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10f80 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10f90 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10fa0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
10fb0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
10fc0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10fd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10fe0 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10ff0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
11000 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
11010 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
11020 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
11030 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
11040 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
11050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
11060 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
11070 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
11080 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
11090 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
110a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
110b0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
110c0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
110d0 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
110e0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
110f0 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
11100 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
11110 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
11120 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
11130 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
11140 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
11150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11160 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
11170 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
11180 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
11190 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
111a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
111b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
111c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
111d0 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
11200 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
11210 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
11240 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
11250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
11260 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
11270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11280 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
11290 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
112a0 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
112d0 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
112e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
112f0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
11300 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11310 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
11320 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
11330 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
11340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11350 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
11360 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
11370 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
11380 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20  er->jfd).  ){.  
11390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113a0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
113b0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
113c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
113d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
113e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
113f0 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
11400 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
11410 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
11420 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
11430 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
11440 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
11450 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
11460 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
11470 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
11480 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
11490 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
114a0 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
114b0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
114c0 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
114d0 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
114e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
114f0 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
11500 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
11510 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
11520 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
11530 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
11540 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
11550 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
11560 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
11570 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11580 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
11590 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
115a0 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
115b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
115c0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
115d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
115e0 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
115f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11600 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
11610 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
11620 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11630 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11640 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
11650 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11660 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11670 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
11680 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
11690 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
116a0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
116b0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
116c0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
116d0 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
116e0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
116f0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11700 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11710 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
11720 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
11730 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11740 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11750 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11760 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
11770 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
11780 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
11790 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
117a0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
117b0 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 8,.           
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b        iHdrOff+4+
117e0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
117f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11800 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11810 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
11820 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
11830 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11840 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11850 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11860 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11870 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11880 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
11890 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
118a0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
118b0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
118c0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
118d0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
118e0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
118f0 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
11900 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
11910 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
11920 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
11930 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
11940 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11950 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11960 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11970 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11980 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
11990 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
119a0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
119b0 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
119c0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
119d0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
119e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
119f0 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
11a00 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
11a10 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
11a20 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
11a30 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11a40 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11a50 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11a60 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11a70 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11a80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
11a90 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
11aa0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
11ab0 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
11ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11ad0 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
11ae0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
11af0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
11b00 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11b10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11b20 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11b30 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
11b40 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
11b50 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11b60 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11b70 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11b80 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11b90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11bb0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61   the pPager->iDa
11bc0 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a  taVersion value.
11bd0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61  */.u32 sqlite3Pa
11be0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50  gerDataVersion(P
11bf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11c00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11c10 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
11c20 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  EN );.  return p
11c30 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11c40 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11c50 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11c60 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11c70 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11c80 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11c90 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11ca0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11cb0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11cc0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11cd0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
11ce0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11cf0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11d00 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11d10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11d20 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11d30 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11d40 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11d60 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11d70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11d80 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11d90 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11da0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11db0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11dc0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11dd0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
11de0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11df0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11e00 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11e10 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11e20 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
11e30 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a  emory(pPager->sj
11e40 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
11e50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11e60 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
11e70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
11e80 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
11e90 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
11ea0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11eb0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
11ec0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
11ed0 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
11ee0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
11ef0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
11f00 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
11f10 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
11f20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
11f30 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
11f40 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
11f50 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
11f60 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
11f70 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
11f80 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
11f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11fa0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
11fb0 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
11fc0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
11fd0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12000 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12010 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
12020 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
12030 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
12040 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12050 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
12060 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
12070 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
12080 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
12090 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
120a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
120b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
120c0 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
120d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
120e0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
120f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
12100 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
12110 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
12120 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
12130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12160 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
12170 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12180 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
12190 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
121a0 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
121b0 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
121c0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
121d0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
121e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
121f0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
12200 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
12210 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
12220 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
12230 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
12240 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
12250 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
12260 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12270 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
12280 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
12290 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
122a0 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
122b0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
122c0 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
122d0 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
122e0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
122f0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
12300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12310 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
12320 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
12330 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
12340 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
12350 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
12360 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
12370 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
12380 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
12390 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
123a0 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
123b0 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
123c0 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
123d0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
123e0 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
123f0 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
12400 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
12410 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
12420 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
12430 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
12440 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
12450 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
12460 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
12470 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
12480 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
12490 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
124a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
124b0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
124c0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
124d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
124e0 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
124f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12500 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
12510 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
12520 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
12530 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
12540 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
12550 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  al = 0;.  releas
12560 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
12570 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
12580 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
12590 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
125a0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
125b0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71  ->jfd) );.    sq
125c0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
125d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
125e0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50  r->pWal);.    pP
125f0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12600 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGER_OPEN;.  }el
12610 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
12620 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
12630 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12650 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
12660 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67   returned by pag
12670 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a  erUnlockDb() */.
12680 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
12690 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
126a0 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
126b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
126c0 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
126d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
126e0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
126f0 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
12700 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
12710 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
12720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12730 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
12740 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
12750 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
12760 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
12770 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
12780 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
12790 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
127a0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
127b0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
127c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
127d0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
127e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
127f0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12800 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12810 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
12820 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12830 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12840 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
12850 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12860 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12870 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12880 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
12890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
128a0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
128b0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
128c0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
128d0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
128e0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
128f0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66   5)==1 );.    if
12900 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49  ( 0==(iDc & SQLI
12910 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
12920 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a  ABLE_WHEN_OPEN).
12930 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67       || 1!=(pPag
12940 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
12950 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  & 5).    ){.    
12960 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12970 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
12980 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12990 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
129a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
129b0 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
129c0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
129d0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
129e0 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63  fails, set the c
129f0 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55  urrent lock to U
12a00 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
12a10 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20   the comment.   
12a20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64   ** above the #d
12a30 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57  efine for UNKNOW
12a40 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
12a50 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79  planation of why
12a60 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
12a70 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
12a80 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
12a90 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
12aa0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
12ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ac0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
12ad0 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
12ae0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
12af0 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e  >eLock = UNKNOWN
12b00 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  _LOCK;.    }..  
12b10 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73    /* The pager s
12b20 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e  tate may be chan
12b30 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45  ged from PAGER_E
12b40 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50  RROR to PAGER_OP
12b50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  EN here.    ** w
12b60 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20  ithout clearing 
12b70 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
12b80 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f  This is intentio
12b90 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a  nal - the error.
12ba0 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63      ** code is c
12bb0 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63  leared and the c
12bc0 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68  ache reset in th
12bd0 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20  e block below.. 
12be0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12bf0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12c00 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
12c10 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12c20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12c30 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12c40 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12c50 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12c60 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OPEN;.  }..  /* 
12c70 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
12c80 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
12c90 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12ca0 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
12cb0 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  be.  ** trusted.
12cc0 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20   Now that there 
12cd0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
12ce0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
12cf0 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a   the pager,.  **
12d00 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d   it can safely m
12d10 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ove back to PAGE
12d20 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68  R_OPEN state. Th
12d30 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f  is happens in bo
12d40 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61  th.  ** normal a
12d50 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  nd exclusive-loc
12d60 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  king mode..  */.
12d70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12d80 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12d90 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
12da0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12db0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
12dc0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
12dd0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
12de0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
12df0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
12e00 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12e10 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ne = 0;.      pP
12e20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12e30 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d  AGER_OPEN;.    }
12e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
12e50 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73  er->eState = (is
12e60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
12e70 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a  ) ? PAGER_OPEN :
12e80 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a   PAGER_READER);.
12e90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53      }.    if( US
12ea0 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
12eb0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
12ec0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
12ed0 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   0);.    pPager-
12ee0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
12ef0 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65 74  E_OK;.    setGet
12f00 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
12f10 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  );.  }..  pPager
12f20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12f30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12f40 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
12f50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
12f60 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
12f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12f80 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
12f90 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
12fa0 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
12fb0 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
12fc0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
12fd0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
12fe0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
12ff0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
13000 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
13010 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13020 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
13030 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
13040 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
13050 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
13060 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
13070 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
13080 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
13090 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
130a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
130b0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
130c0 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
130d0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
130e0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
130f0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
13100 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
13110 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
13120 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
13130 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
13140 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
13150 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
13160 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
13170 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
13180 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
13190 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
131a0 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
131b0 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
131c0 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
131d0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
131e0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
131f0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
13200 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
13210 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
13220 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
13230 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
13240 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
13250 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
13260 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
13270 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
13280 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
13290 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
132a0 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
132b0 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
132c0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
132d0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
132e0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
132f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
13300 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
13310 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
13320 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
13330 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
13340 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
13350 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
13360 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
13370 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
13380 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
13390 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
133a0 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
133b0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
133c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
133d0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
133e0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
133f0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
13400 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
13410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
13420 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
13430 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
13440 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
13450 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
13460 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
13470 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
13480 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
13490 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
134a0 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
134b0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
134c0 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20  AGER_ERROR;.    
134d0 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
134e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
134f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
13500 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
13510 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
13520 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
13530 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72  );../*.** The wr
13540 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13550 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69  open on pPager i
13560 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
13570 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a  d (bCommit==1).*
13580 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * or rolled back
13590 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a   (bCommit==0)..*
135a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
135b0 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
135c0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
135d0 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65  should be flushe
135e0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
135f0 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Rules:.**.**   
13600 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20  *  For non-TEMP 
13610 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79  databases, alway
13620 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20  s sync to disk. 
13630 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
13640 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74  ry.**      for t
13650 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62  ransactions to b
13660 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  e durable..**.**
13670 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20     *  Sync TEMP 
13680 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e  database only on
13690 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61   a COMMIT (not a
136a0 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20   ROLLBACK) when 
136b0 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20  the backing.**  
136c0 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65 65      file has bee
136d0 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61 64  n created alread
136e0 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f  y (via a spill o
136f0 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29 29  n pagerStress())
13700 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65   and.**      whe
13710 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13720 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d  dirty pages in m
13730 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32 35  emory exceeds 25
13740 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a  % of the total.*
13750 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69 7a  *      cache siz
13760 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13770 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d   pagerFlushOnCom
13780 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
13790 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
137a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
137b0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  empFile==0 ) ret
137c0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43  urn 1;.  if( !bC
137d0 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  ommit ) return 0
137e0 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
137f0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
13800 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
13810 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65 50   (sqlite3PCacheP
13820 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61 67  ercentDirty(pPag
13830 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35  er->pPCache)>=25
13840 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
13850 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
13860 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
13870 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
13880 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
13890 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
138a0 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
138b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
138c0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
138d0 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
138e0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
138f0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
13900 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13910 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
13920 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
13930 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
13940 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
13950 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
13960 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
13970 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
13980 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13990 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
139a0 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
139b0 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
139c0 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
139d0 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
139e0 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
139f0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
13a00 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
13a10 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
13a20 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
13a30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
13a40 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
13a50 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
13a60 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
13a70 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
13a80 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
13a90 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
13aa0 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
13ab0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
13ac0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
13ad0 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
13ae0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
13af0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
13b00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
13b10 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
13b20 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
13b30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
13b40 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
13b50 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13b60 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
13b70 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
13b80 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
13b90 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
13ba0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13bb0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13bc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13bd0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
13be0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
13bf0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
13c00 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
13c10 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13c20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
13c30 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13c40 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
13c50 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13c60 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13c70 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13c80 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13c90 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13ca0 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13cb0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13cc0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
13cd0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
13ce0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
13cf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13d00 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
13d10 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
13d20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13d30 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13d40 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
13d50 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13d60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13d70 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13d80 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13d90 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13da0 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13db0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
13dc0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
13dd0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
13de0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
13df0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
13e00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
13e10 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
13e20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
13e30 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13e40 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
13e50 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13e60 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13e70 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13e80 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13e90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13ea0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13eb0 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
13ec0 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
13ed0 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
13ee0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13ef0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13f00 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
13f10 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
13f20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13f30 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
13f40 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
13f50 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
13f60 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
13f70 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
13f80 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13f90 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13fa0 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13fb0 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13fc0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13fd0 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13fe0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13ff0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14000 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
14010 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
14020 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
14030 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
14040 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
14050 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
14060 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
14070 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
14080 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
14090 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
140a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
140b0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
140c0 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
140d0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
140e0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
140f0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
14100 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
14110 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
14120 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
14130 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
14140 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
14150 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
14160 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
14170 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
14180 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
14190 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
141a0 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
141b0 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
141c0 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
141d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
141e0 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
141f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14200 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
14210 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
14220 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
14230 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
14240 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14250 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
14260 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
14270 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14280 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
14290 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
142a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
142b0 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
142c0 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
142d0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
142e0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
142f0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
14300 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
14310 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14320 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
14330 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
14340 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
14350 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
14360 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
14370 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
14380 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
14390 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
143a0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
143b0 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
143c0 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
143d0 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
143e0 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
143f0 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
14400 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
14410 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
14420 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
14430 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
14440 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
14450 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
14460 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
14470 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
14480 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
14490 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
144a0 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
144b0 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
144c0 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
144d0 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
144e0 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
144f0 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
14500 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
14510 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14520 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
14530 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
14540 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
14550 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14560 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
14570 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
14580 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
14590 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
145a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
145b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
145c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
145d0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
145e0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
145f0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
14600 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
14610 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
14620 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
14630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14640 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
14650 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
14660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
14670 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
14680 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
14690 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20 20  ournal==0 .     
146a0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
146b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
146c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
146d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
146e0 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b 0a  CH_ATOMIC).  );.
146f0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
14700 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
14710 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
14720 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
14730 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
14740 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14750 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
14760 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
14770 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
14780 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  jfd) ){.      /*
14790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
147a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
147b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
147c0 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20  MEMORY ); */.   
147d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
147e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
147f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14800 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14810 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14820 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
14830 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
14840 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
14850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
14890 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
148a0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
148b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
148c0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
148d0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
148e0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
148f0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
14900 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
14910 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
14920 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
14930 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
14940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
14950 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
14960 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
14970 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
14980 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
14990 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
149a0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
149b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
149c0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
149d0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
149e0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
149f0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
14a00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14a10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
14a20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
14a30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
14a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14a60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
14a80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14a90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14aa0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
14ab0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
14ac0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
14ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14ae0 64 65 3c 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  de<PAGER_JOURNAL
14af0 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
14b00 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
14b10 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
14b20 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70 50  r, hasMaster||pP
14b30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
14b40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14b50 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b70 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
14b80 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
14b90 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
14ba0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
14bb0 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
14bc0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
14bd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
14be0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
14bf0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
14c00 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
14c10 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
14c20 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
14c30 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
14c40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
14c50 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
14c60 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
14c70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
14c80 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
14c90 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14ca0 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70   = !pPager->temp
14cb0 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65  File;.      asse
14cc0 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  rt( sqlite3Journ
14cd0 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14ce0 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a  ger->jfd)==0 );.
14cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14d10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14d20 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
14d30 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
14d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14d50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14d60 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
14d70 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14d80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14d90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
14da0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  AL.           ||
14db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14dc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14dd0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20 20  NALMODE_WAL2.   
14de0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
14df0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14e00 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
14e10 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
14e20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e30 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
14e40 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
14e50 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
14e60 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20  r->extraSync);. 
14e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14e80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14e90 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
14ea0 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
14eb0 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
14ec0 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
14ed0 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
14ee0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
14ef0 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
14f00 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
14f10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
14f20 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
14f30 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
14f40 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  Lookup(pPager, 1
14f50 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
14f60 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
14f70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
14f80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
14f90 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
14fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
14fb0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
14fc0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
14fd0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
14fe0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
14ff0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
15000 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
15010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15020 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61   if( MEMDB || pa
15030 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
15040 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74  (pPager, bCommit
15050 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
15060 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
15070 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15080 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15090 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
150a0 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
150b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
150c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
150d0 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
150e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
150f0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
15100 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
15110 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
15120 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
15130 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
15140 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
15150 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
15160 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
15170 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
15180 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
15190 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
151a0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
151b0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
151c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
151d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
151e0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
151f0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
15200 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
15210 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
15220 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
15230 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
15240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15250 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
15260 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
15270 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
15280 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
15290 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
152a0 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
152b0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
152c0 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
152d0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
152e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
152f0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
15300 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
15310 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
15320 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
15330 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
15340 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
15350 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
15360 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
15370 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
15380 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
15390 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
153a0 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
153b0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
153c0 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
153d0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
153e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
153f0 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
15400 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
15410 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
15420 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
15430 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15440 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
15450 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
15460 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
15470 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
15480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15490 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
154a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
154b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
154c0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
154d0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
154e0 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
154f0 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
15500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15510 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
15520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15530 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
15540 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
15550 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
15560 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
15570 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
15580 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
15590 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
155a0 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
155b0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
155c0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
155d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
155e0 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
155f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
15600 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
15610 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15620 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
15630 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
15640 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
15650 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
15660 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
15670 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
15680 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
15690 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
156a0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
156b0 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
156c0 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
156d0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
156e0 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
156f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
15700 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
15710 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
15720 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
15730 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15740 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
15750 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
15760 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
15770 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
15780 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
15790 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
157a0 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
157b0 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
157c0 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
157d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
157e0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
157f0 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
15800 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
15810 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
15820 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
15830 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
15840 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
15850 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
15860 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15870 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
15880 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15890 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
158a0 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
158b0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
158c0 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
158d0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
158e0 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
158f0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
15900 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
15910 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
15920 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
15930 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
15940 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
15950 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
15960 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
15970 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
15980 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
15990 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
159a0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
159b0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
159c0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
159d0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
159e0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
159f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
15a00 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
15a10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15a20 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
15a30 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
15a40 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
15a50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
15a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
15a70 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
15a80 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
15a90 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
15aa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
15ab0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15ac0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
15ad0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15ae0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
15af0 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
15b00 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
15b10 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
15b20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
15b30 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
15b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
15b50 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
15b60 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
15b70 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
15b80 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
15b90 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
15ba0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
15bb0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
15bc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
15bd0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
15be0 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
15bf0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
15c00 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
15c10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
15c20 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
15c30 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
15c40 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
15c50 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
15c60 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
15c70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
15c80 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
15c90 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
15ca0 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
15cb0 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
15cc0 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
15cd0 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
15ce0 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
15cf0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
15d00 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
15d10 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
15d20 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
15d30 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
15d40 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
15d50 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
15d60 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
15d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
15d80 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
15d90 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
15da0 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
15db0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
15dc0 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
15dd0 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
15de0 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
15df0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
15e00 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
15e10 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
15e20 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
15e30 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
15e40 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
15e50 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
15e60 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
15e70 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
15e80 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
15e90 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
15ea0 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
15eb0 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
15ec0 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
15ed0 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
15ee0 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
15ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
15f00 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
15f10 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
15f20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
15f30 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
15f40 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
15f50 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
15f60 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
15f70 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
15f80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
15f90 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
15fa0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15fb0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
15fc0 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
15fd0 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
15fe0 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
15ff0 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
16000 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
16010 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
16020 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
16030 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
16040 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
16050 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16060 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
16070 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
16080 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
16090 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
160a0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
160b0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
160c0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
160d0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
160e0 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
160f0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
16120 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
16130 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
16140 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
16150 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
16160 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
16170 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
16180 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
16190 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
161a0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
161b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
161c0 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65  rved bits is the
161d0 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73   same in the des
161e0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65  tination.** page
161f0 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68  r as it is in th
16200 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20  e source.  This 
16210 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20  comes up when a 
16220 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74  VACUUM changes t
16230 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
16240 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f  reserved bits to
16250 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61   the "optimal" a
16260 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mount..*/.void s
16270 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e  qlite3PagerAlign
16280 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70  Reserve(Pager *p
16290 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72  Dest, Pager *pSr
162a0 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  c){.  if( pDest-
162b0 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d  >nReserve!=pSrc-
162c0 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20  >nReserve ){.   
162d0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
162e0 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76   = pSrc->nReserv
162f0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
16300 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20  rtSize(pDest);. 
16310 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
16320 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
16330 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
16340 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
16350 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
16360 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
16370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16380 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
16390 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
163a0 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
163b0 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
163c0 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
163d0 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
163e0 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
163f0 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
16400 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
16410 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
16420 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
16430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
16440 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16450 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
16460 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
16470 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
16480 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
16490 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
164a0 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
164b0 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
164c0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
164d0 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
164e0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
164f0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
16500 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
16510 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
16520 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
16530 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16540 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
16550 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
16560 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
16570 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
16580 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
16590 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
165a0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
165b0 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
165c0 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
165d0 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
165e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
165f0 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
16600 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
16610 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
16620 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
16630 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
16640 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
16650 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
16660 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
16670 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
16680 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
16690 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
166a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
166b0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
166c0 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
166d0 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
166e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
166f0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16700 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
16710 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
16720 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16730 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
16740 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
16750 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
16760 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
16770 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
16780 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
16790 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
167a0 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
167b0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
167c0 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
167d0 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
167e0 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
167f0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16800 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
16810 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
16820 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
16830 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
16840 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
16850 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
16860 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
16870 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
16880 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
16890 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
168a0 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
168b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
168c0 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
168d0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
168e0 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
168f0 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
16900 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
16910 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
16920 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
16930 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
16940 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16950 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
16960 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
16970 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
16980 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
16990 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
169a0 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
169b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
169c0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
169d0 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
169e0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
169f0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
16a00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
16a10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
16a20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
16a30 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
16a40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
16a50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
16a60 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
16a70 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
16a80 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
16a90 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
16aa0 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
16ab0 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
16ac0 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
16ad0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
16ae0 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
16af0 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
16b00 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
16b10 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
16b20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
16b30 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
16b40 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
16b50 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b70 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
16b80 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
16b90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
16ba0 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16bc0 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
16bd0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
16be0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
16c10 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
16c20 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
16c30 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c50 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
16c60 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
16c70 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
16c80 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
16c90 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
16ca0 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
16cb0 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
16cc0 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
16cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16ce0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16cf0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
16d00 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
16d10 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
16d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16d30 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
16d40 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69   is synced */.#i
16d50 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16d60 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a  CODEC.  /* The j
16d70 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74  rnlEnc flag is t
16d80 72 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70  rue if Journal p
16d90 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
16da0 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20  assed through.  
16db0 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49  ** the codec.  I
16dc0 74 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70  t is false for p
16dd0 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  ure in-memory jo
16de0 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e  urnals. */.  con
16df0 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d  st int jrnlEnc =
16e00 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20   (isMainJrnl || 
16e10 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
16e20 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66  mory==0);.#endif
16e30 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
16e40 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
16e50 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
16e60 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
16e70 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
16e80 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
16e90 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
16ea0 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
16eb0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
16ec0 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
16ed0 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
16ee0 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
16ef0 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
16f00 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16f10 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
16f20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
16f30 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
16f40 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
16f50 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
16f60 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
16f70 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
16f80 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
16f90 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
16fa0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
16fb0 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
16fc0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
16fd0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
16fe0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
16ff0 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
17000 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
17010 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
17020 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
17030 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
17040 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
17050 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
17060 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
17070 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
17080 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
17090 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
170a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
170b0 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
170c0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
170d0 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
170e0 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
170f0 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
17100 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
17110 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
17120 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
17130 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
17140 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
17150 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
17160 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17170 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17180 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17190 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
171a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
171b0 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
171c0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
171d0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
171e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
171f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
17200 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
17210 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
17220 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
17230 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
17240 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
17250 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
17260 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
17270 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
17280 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
17290 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
172a0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
172b0 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
172c0 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
172d0 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
172e0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
172f0 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
17300 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
17310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17320 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
17330 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
17340 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
17350 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17360 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
17370 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
17380 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17390 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
173a0 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
173b0 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
173c0 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
173d0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
173e0 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
173f0 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
17400 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
17410 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
17420 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
17430 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
17440 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
17450 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
17460 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
17470 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
17480 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
17490 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
174a0 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
174b0 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
174c0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
174d0 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
174e0 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
174f0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
17500 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
17510 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
17520 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
17530 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
17540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17550 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
17560 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
17570 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
17580 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
17590 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
175a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
175b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
175c0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
175d0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
175e0 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
175f0 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
17600 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
17610 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
17620 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17630 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
17640 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
17650 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
17660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
17670 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
17680 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
17690 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
176a0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
176b0 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
176c0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
176d0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
176e0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
176f0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
17700 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
17710 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
17720 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
17730 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
17740 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17750 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17760 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
17770 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
17780 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
17790 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
177a0 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
177b0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
177c0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
177d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
177e0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
177f0 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
17800 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17810 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
17820 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
17830 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
17840 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
17850 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
17860 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
17870 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
17880 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
17890 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
178a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
178b0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
178c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
178d0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
178e0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
178f0 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
17900 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
17910 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
17920 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
17930 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
17940 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
17950 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
17960 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
17970 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
17980 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
17990 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
179a0 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
179b0 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
179c0 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
179d0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
179e0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
179f0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
17a00 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
17a10 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
17a20 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
17a30 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
17a40 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
17a50 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
17a60 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
17a70 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
17a80 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
17a90 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
17aa0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
17ab0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
17ac0 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
17ad0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
17ae0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
17af0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
17b00 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
17b10 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
17b20 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
17b30 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
17b40 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
17b50 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
17b60 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17b70 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
17b80 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
17b90 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
17ba0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
17bb0 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
17bc0 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
17bd0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
17be0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
17bf0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
17c00 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
17c10 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
17c20 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
17c30 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
17c40 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17c50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
17c60 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
17c70 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
17c80 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
17c90 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
17ca0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
17cb0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
17cc0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
17cd0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
17ce0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
17cf0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
17d00 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
17d10 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
17d20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
17d30 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
17d40 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
17d50 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17d60 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
17d70 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
17d80 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
17d90 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
17da0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
17db0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
17dc0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
17dd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
17de0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
17df0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
17e00 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
17e10 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
17e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
17e30 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
17e40 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
17e50 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
17e60 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
17e70 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
17e80 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
17e90 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
17ea0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
17eb0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
17ec0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
17ed0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
17ee0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
17ef0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
17f00 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
17f10 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
17f20 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
17f30 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
17f40 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
17f50 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
17f60 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
17f70 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
17f80 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
17f90 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
17fa0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
17fb0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
17fc0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
17fd0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
17fe0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
17ff0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
18000 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
18010 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
18020 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
18030 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
18040 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
18050 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
18060 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
18070 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
18080 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
18090 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
180a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
180b0 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
180c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
180d0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
180e0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c  PEN || pPg==0 ||
180f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18100 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  e );.  PAGERTRAC
18110 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
18120 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
18130 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
18140 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
18150 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
18160 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
18170 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
18180 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
18190 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
181a0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
181b0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
181c0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
181d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
181e0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
181f0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
18200 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
18210 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
18220 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
18230 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
18240 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
18250 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
18260 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
18270 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
18280 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
18290 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
182a0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
182b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
182c0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
182d0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
182e0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
182f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
18300 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
18310 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
18320 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
18330 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
18340 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
18350 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18360 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
18370 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
18380 20 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20   Write the data 
18390 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
183a0 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20  urnal back into 
183b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
183c0 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  e..    ** This i
183d0 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65  s usually safe e
183e0 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79  ven for an encry
183f0 70 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20  pted database - 
18400 61 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  as the data.    
18410 2a 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64  ** was encrypted
18420 20 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77   before it was w
18430 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
18440 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
18450 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a  exception.    **
18460 20 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20   is if the data 
18470 77 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72  was just read fr
18480 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
18490 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  sub-journal. In 
184a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65  that.    ** case
184b0 20 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72   it must be encr
184c0 79 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72  ypted here befor
184d0 65 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  e it is copied i
184e0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
184f0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a  .    ** file.  *
18500 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18510 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
18520 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  ( !jrnlEnc ){.  
18530 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
18540 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
18550 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
18560 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b  EM_BKPT, aData);
18570 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18580 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
18590 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
185a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
185b0 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
185c0 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
185d0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
185e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
185f0 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c  M_BKPT);.    }el
18600 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  se.#endif.    rc
18610 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18620 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
18630 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
18640 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18650 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e  t);..    if( pgn
18660 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18670 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
18680 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
18690 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
186a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
186b0 42 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66  Backup ){.#ifdef
186c0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
186d0 43 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c  C.      if( jrnl
186e0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Enc ){.        C
186f0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
18700 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
18710 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18720 50 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  PT);.        sql
18730 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
18740 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
18750 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
18760 74 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  ta);.        COD
18770 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
18780 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
18790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
187a0 2c 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  ,aData);.      }
187b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
187c0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
187d0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
187e0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
187f0 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  *)aData);.    }.
18800 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
18810 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
18820 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
18830 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
18840 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
18850 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
18860 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
18870 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
18880 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
18890 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
188a0 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
188b0 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
188c0 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
188d0 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
188e0 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
188f0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
18900 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
18910 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
18920 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
18930 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
18940 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
18950 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
18960 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
18970 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
18980 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
18990 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
189a0 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
189b0 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
189c0 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
189d0 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
189e0 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
189f0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
18a00 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
18a10 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
18a20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
18a30 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
18a40 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
18a50 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
18a60 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
18a70 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
18a80 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
18a90 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
18aa0 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
18ab0 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
18ac0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
18ad0 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
18ae0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
18af0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
18b00 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
18b10 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
18b20 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
18b30 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
18b40 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
18b50 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
18b60 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
18b70 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
18b80 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
18b90 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
18ba0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
18bb0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
18bc0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
18bd0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
18be0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
18bf0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
18c00 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18c10 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
18c20 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
18c30 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
18c40 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
18c50 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
18c60 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
18c70 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
18c80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
18c90 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
18ca0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
18cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18cc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18cd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
18ce0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
18cf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
18d00 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
18d10 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
18d20 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
18d30 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
18d40 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
18d50 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
18d60 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
18d70 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
18d80 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
18d90 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
18da0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
18db0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
18dc0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
18dd0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
18de0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
18df0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
18e00 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
18e10 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
18e20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
18e30 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
18e40 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
18e50 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
18e60 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
18e70 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
18e80 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
18e90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
18eb0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
18ec0 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62   /* It used to b
18ed0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63  e that sqlite3Pc
18ee0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
18ef0 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65  g) was called he
18f00 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  re.  But.    ** 
18f10 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61  that call was da
18f20 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20  ngerous and had 
18f30 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65  no detectable be
18f40 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20  nefit since the 
18f50 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20  cache.    ** is 
18f60 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64  normally cleaned
18f70 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
18f80 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65  eCleanAll() afte
18f90 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
18fa0 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  o.    ** has bee
18fb0 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  n removed. */.  
18fc0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
18fd0 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
18fe0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
18ff0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
19000 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
19010 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
19020 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
19030 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
19040 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
19050 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
19060 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
19070 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
19080 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
19090 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
190a0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
190b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
190c0 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
190d0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
190e0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  */.#if SQLITE_HA
190f0 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
19100 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43  jrnlEnc ){ CODEC
19110 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
19120 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
19130 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
19140 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  KPT); }.#endif. 
19150 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19160 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
19170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19180 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
19190 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
191a0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
191b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
191c0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
191d0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
191e0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
191f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19200 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
19210 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
19220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
19230 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
19240 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
19250 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19260 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
19270 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
19280 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
19290 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
192a0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
192b0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
192c0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
192d0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
192e0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
192f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
19300 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
19310 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
19320 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
19330 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
19340 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
19350 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
19360 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
19370 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
19380 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
19390 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
193a0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
193b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
193c0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
193d0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
193e0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
193f0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
19400 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
19410 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
19420 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
19430 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
19440 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
19450 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
19460 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
19470 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
19480 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
19490 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
194a0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
194b0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
194c0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
194d0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
194e0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
194f0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
19500 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
19510 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
19520 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19530 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
19540 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
19550 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
19560 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
19570 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
19580 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
19590 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
195a0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
195b0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
195c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
195d0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
195e0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
195f0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19600 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
19610 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
19620 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
19630 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
19640 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
19650 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
19660 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
19670 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
19680 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
19690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
196a0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
196b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
196c0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
196d0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
196e0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
196f0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
19700 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
19710 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
19720 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
19730 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
19740 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
19750 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
19760 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
19770 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
19780 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
19790 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
197a0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
197b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
197c0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
197d0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
197e0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
197f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19800 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19810 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19820 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
19830 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
19840 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
19850 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19860 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
19870 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
19880 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
19890 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
198a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
198b0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
198c0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
198d0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
198e0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
198f0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
19900 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
19910 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19920 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
19930 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
19940 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
19950 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19960 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
19970 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19990 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
199a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
199b0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
199c0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
199d0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
199e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
199f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
19a00 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
19a10 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
19a20 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19a30 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
19a40 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
19a50 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
19a60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19a70 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
19a80 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
19a90 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
19aa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19ab0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
19ac0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
19ad0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
19ae0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
19af0 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
19b00 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
19b10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
19b20 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
19b30 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
19b40 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19b50 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
19b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
19b70 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
19b80 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
19b90 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
19ba0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
19bb0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
19bc0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
19bd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19be0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
19bf0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
19c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19c10 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
19c20 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
19c30 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
19c40 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
19c50 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
19c60 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
19c70 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
19c80 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
19c90 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
19ca0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
19cb0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
19cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19cd0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
19ce0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
19cf0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19d00 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19d10 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
19d20 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
19d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19d40 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
19d50 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
19d60 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
19d70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19d80 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19d90 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
19da0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
19db0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19dc0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
19dd0 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
19de0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
19df0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
19e00 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
19e10 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
19e20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
19e30 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
19e40 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
19e50 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
19e60 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
19e70 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
19e80 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
19e90 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
19ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19eb0 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
19ec0 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
19ed0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19ee0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19ef0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
19f00 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
19f10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
19f20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
19f30 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
19f40 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
19f50 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
19f60 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
19f70 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
19f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19f90 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
19fa0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19fb0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
19fc0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
19fd0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
19fe0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
19ff0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
1a000 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
1a010 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
1a020 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
1a030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a040 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
1a050 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
1a060 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
1a070 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
1a080 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
1a090 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
1a0a0 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
1a0b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
1a0c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
1a0d0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
1a0e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a0f0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1a100 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a110 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1a120 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1a130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a140 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
1a150 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
1a160 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
1a170 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1a180 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
1a190 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
1a1a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a1b0 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
1a1c0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
1a1d0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
1a1e0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
1a1f0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
1a200 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
1a210 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
1a220 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a230 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
1a240 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
1a250 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1a260 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
1a270 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
1a280 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1a290 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a2a0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1a2b0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
1a2c0 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
1a2d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a2f0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a300 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a310 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1a320 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
1a330 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
1a340 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
1a350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1a360 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
1a370 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a390 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a3a0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a3b0 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
1a3c0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
1a3d0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
1a3e0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
1a3f0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
1a400 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
1a410 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
1a420 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1a430 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1a440 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
1a450 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a470 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
1a480 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1a490 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
1a4a0 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
1a4b0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1a4c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1a4d0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
1a4e0 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
1a4f0 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
1a500 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
1a510 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
1a520 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
1a530 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1a540 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
1a550 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
1a560 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
1a570 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
1a580 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a590 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1a5a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a5b0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
1a5c0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1a5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
1a5e0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
1a5f0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
1a600 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
1a610 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
1a620 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
1a630 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1a640 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
1a650 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
1a660 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
1a670 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1a680 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1a690 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
1a6a0 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
1a6b0 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
1a6c0 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
1a6d0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
1a6e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1a6f0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1a700 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
1a710 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
1a720 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
1a730 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
1a740 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
1a750 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1a760 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
1a770 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
1a780 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
1a790 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
1a7a0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
1a7b0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
1a7c0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
1a7d0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1a7e0 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
1a7f0 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
1a800 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
1a810 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
1a820 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a830 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1a840 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
1a850 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
1a860 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
1a870 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
1a880 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
1a890 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
1a8a0 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
1a8b0 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
1a8c0 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
1a8d0 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
1a8e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a8f0 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
1a900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1a910 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
1a920 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1a930 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1a940 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
1a950 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1a960 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
1a970 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
1a980 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1a990 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
1a9a0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
1a9b0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1a9c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1a9d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a9e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1a9f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1aa00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1aa10 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1aa20 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
1aa30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1aa40 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
1aa50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1aa60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1aa70 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1aa80 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1aa90 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
1aaa0 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
1aab0 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
1aac0 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
1aad0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1aae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1aaf0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1ab00 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
1ab10 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
1ab20 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
1ab30 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
1ab40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ab50 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1ab60 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
1ab70 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
1ab80 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
1ab90 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
1aba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1abb0 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
1abc0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
1abd0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
1abe0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1abf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
1ac00 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
1ac10 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
1ac20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
1ac30 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
1ac40 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
1ac50 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
1ac60 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1ac70 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
1ac80 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
1ac90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
1aca0 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1acb0 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
1acc0 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1acd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1ace0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
1acf0 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
1ad00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ad10 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1ad20 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
1ad30 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
1ad40 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
1ad50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ad60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ad70 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1ad80 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1ad90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ada0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1adb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1adc0 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
1add0 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
1ade0 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
1adf0 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
1ae00 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
1ae10 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
1ae20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
1ae30 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1ae40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1ae50 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1ae60 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1ae70 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
1ae80 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1ae90 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
1aea0 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
1aeb0 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
1aec0 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
1aed0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1aee0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1aef0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1af00 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1af10 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1af20 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1af30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1af40 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1af50 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1af60 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1af70 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1af80 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1af90 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1afa0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1afb0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1afc0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1afd0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1afe0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1aff0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1b000 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1b010 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1b020 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1b030 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1b040 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1b050 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1b060 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1b070 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b080 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1b090 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1b0a0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1b0b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1b0c0 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1b0d0 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1b0e0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b0f0 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1b100 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b110 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b120 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1b130 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1b140 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1b150 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1b160 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1b170 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1b180 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b190 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b1a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1b1b0 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1b1c0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b1d0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1b1e0 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1b1f0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1b200 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1b210 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1b220 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1b230 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1b240 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1b250 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1b260 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1b270 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1b280 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1b290 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1b2a0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1b2b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1b2c0 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1b2d0 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1b2e0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1b2f0 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1b300 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1b310 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1b320 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1b330 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1b340 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1b350 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1b360 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1b370 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1b380 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1b390 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1b3a0 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1b3b0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b3c0 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1b3d0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1b3e0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1b3f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b400 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1b410 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1b420 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b430 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1b440 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1b450 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1b460 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1b470 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1b490 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1b4a0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1b4b0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1b4c0 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1b4d0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1b4e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1b4f0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1b500 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1b510 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1b520 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1b530 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1b540 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1b550 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1b560 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1b570 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1b580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1b590 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1b5a0 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1b5b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1b5c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1b5d0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1b5e0 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1b5f0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1b600 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1b610 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1b620 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1b630 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1b640 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1b650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1b660 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1b670 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1b680 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1b690 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1b6a0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1b6b0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b6c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b6d0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1b6e0 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1b6f0 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1b700 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1b710 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1b720 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b730 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1b740 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1b750 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1b760 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1b770 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1b780 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b790 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b7a0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1b7b0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1b7c0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1b7d0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1b7e0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1b7f0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1b800 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1b810 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1b820 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1b830 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1b840 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1b850 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b860 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b870 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1b880 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1b890 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1b8a0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1b8b0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1b8c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b8d0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b8e0 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1b8f0 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1b900 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1b910 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1b920 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1b930 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1b940 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1b950 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1b960 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1b970 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1b980 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1b990 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1b9a0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1b9b0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1b9c0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1b9d0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1b9e0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1b9f0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1ba00 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1ba10 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1ba20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1ba30 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1ba40 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1ba50 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1ba60 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1ba70 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1ba80 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1ba90 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1baa0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1bab0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1bac0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1bad0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1bae0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1baf0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1bb00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1bb10 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1bb20 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1bb30 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1bb40 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1bb50 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1bb60 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1bb70 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1bb80 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1bb90 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1bba0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1bbb0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1bbc0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1bbd0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1bbe0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1bbf0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1bc00 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1bc10 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1bc20 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1bc30 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1bc40 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1bc50 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1bc60 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1bc70 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1bc80 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1bc90 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1bca0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1bcb0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1bcc0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1bcd0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1bce0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1bcf0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1bd00 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1bd10 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1bd20 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1bd30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1bd40 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1bd50 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1bd60 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1bd70 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1bd80 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1bd90 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1bda0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1bdb0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1bdc0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1bdd0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1bde0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1bdf0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1be00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1be10 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1be20 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1be30 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1be40 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1be50 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1be60 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1be70 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1be80 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1be90 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1bea0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1beb0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1bec0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1bed0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1bee0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1bef0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1bf00 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1bf10 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1bf20 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1bf30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1bf40 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1bf50 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1bf60 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1bf70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1bf80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1bf90 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1bfa0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1bfb0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1bfc0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1bfd0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1bfe0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1bff0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1c000 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c010 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1c020 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1c030 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1c040 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1c050 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1c060 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1c070 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1c080 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1c090 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1c0a0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1c0b0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1c0c0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1c0d0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1c0e0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1c0f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c100 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1c110 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1c120 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1c130 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1c140 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1c150 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1c160 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c170 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c180 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1c190 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1c1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c1b0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1c1c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c1d0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c1f0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c200 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1c210 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1c220 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1c230 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1c240 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1c250 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1c260 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c270 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1c280 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1c290 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1c2a0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1c2b0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1c2c0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1c2d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1c2e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1c2f0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1c300 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1c310 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1c320 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1c330 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1c340 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1c350 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1c360 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1c370 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1c380 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c390 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1c3a0 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1c3b0 20 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53    u32 savedPageS
1c3c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
1c3d0 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  geSize;..  /* Fi
1c3e0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1c3f0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1c400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1c410 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1c420 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1c430 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1c440 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c450 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1c460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c470 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c480 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1c490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c4a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1c4b0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1c4c0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1c4d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1c4e0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c4f0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1c500 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1c510 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1c520 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1c530 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1c540 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1c550 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1c560 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c570 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1c580 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1c590 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1c5a0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1c5b0 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1c5c0 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1c5d0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1c5e0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1c5f0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1c600 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1c610 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1c620 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1c630 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1c640 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1c650 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1c660 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c670 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1c680 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1c690 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1c6a0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1c6b0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1c6c0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1c6d0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1c6e0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1c6f0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1c700 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1c710 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1c720 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1c730 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1c740 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1c750 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c760 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c770 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1c780 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1c790 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1c7a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1c7b0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1c7c0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1c7d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c7e0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1c7f0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c800 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1c810 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1c820 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1c830 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1c840 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1c850 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1c860 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1c870 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1c880 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1c890 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1c8a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1c8b0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1c8c0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1c8d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1c8e0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1c8f0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1c900 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1c910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1c920 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1c930 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1c940 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1c950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1c960 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1c970 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1c980 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1c990 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1c9a0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1c9b0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1c9c0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1c9d0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1c9e0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1c9f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1ca00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1ca10 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1ca20 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1ca30 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1ca40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ca50 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1ca60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1ca70 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1ca80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ca90 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1caa0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cab0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1cac0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1cad0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1cae0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1caf0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1cb00 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1cb10 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1cb20 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1cb30 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1cb40 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1cb50 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1cb60 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1cb70 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1cb80 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1cb90 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1cba0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1cbb0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1cbc0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1cbd0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1cbe0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1cbf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1cc00 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1cc10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1cc20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1cc30 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1cc40 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1cc50 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1cc60 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1cc70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1cc80 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1cc90 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1cca0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1ccb0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1ccc0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1ccd0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1cce0 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1ccf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1cd00 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1cd10 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1cd20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cd30 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1cd40 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1cd50 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1cd60 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1cd70 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1cd80 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1cd90 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1cda0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1cdb0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1cdc0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1cdd0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1cde0 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1cdf0 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1ce00 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1ce10 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1ce20 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1ce30 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1ce40 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1ce50 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1ce60 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1ce70 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1ce80 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1ce90 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1cea0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1ceb0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1cec0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1ced0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1cee0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1cef0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1cf00 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1cf10 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1cf20 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1cf30 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1cf40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1cf50 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1cf60 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1cf70 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1cf80 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1cf90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1cfa0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1cfb0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1cfc0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1cfd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cfe0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1cff0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1d000 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d010 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1d020 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1d030 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1d040 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1d050 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d060 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d070 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1d080 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1d090 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1d0a0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1d0b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1d0c0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1d0d0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1d0e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1d0f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1d100 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d110 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1d120 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d130 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1d140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d160 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d170 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1d180 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d190 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1d1a0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1d1b0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1d1c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1d1d0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1d1e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d1f0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1d200 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1d210 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1d220 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1d230 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1d240 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1d250 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1d260 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1d270 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1d280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1d290 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1d2a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1d2b0 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1d2c0 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1d2d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d2e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d2f0 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1d300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d310 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d320 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1d330 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d340 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1d350 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1d380 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1d390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d3a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1d3b0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1d3c0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1d3d0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1d3e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1d3f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1d400 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1d410 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1d420 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1d430 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1d440 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1d450 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1d460 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1d470 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1d480 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1d490 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1d4a0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1d4b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1d4c0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1d4d0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1d4e0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1d4f0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1d500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d510 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1d520 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1d530 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d550 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1d560 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1d570 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1d580 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1d590 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1d5a0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1d5b0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1d5c0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1d5d0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1d5e0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1d5f0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1d600 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1d610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d620 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1d630 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1d640 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1d650 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1d660 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d670 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d680 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1d690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d6a0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1d6b0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1d6c0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1d6d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d6e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d6f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1d700 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
1d710 26 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20  &savedPageSize, 
1d720 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f  -1);.  }.  /* Fo
1d730 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1d740 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1d750 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1d760 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1d770 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1d780 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1d790 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1d7a0 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1d7b0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1d7c0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1d7d0 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1d7e0 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1d7f0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1d800 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1d810 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1d820 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1d830 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1d840 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1d850 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1d860 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  hods ){.    sqli
1d870 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1d880 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1d890 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1d8a0 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20  UNCHANGED,0);.  
1d8b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1d8c0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1d8d0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1d8e0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1d8f0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1d900 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1d910 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1d920 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1d930 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1d940 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1d950 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1d960 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1d970 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1d980 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d990 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1d9a0 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1d9b0 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1d9c0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1d9d0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1d9e0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1d9f0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1da00 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1da10 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1da20 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1da30 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1da40 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1da50 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1da60 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1da70 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1da80 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1da90 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1daa0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1dab0 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1dac0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1dad0 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1dae0 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1daf0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1db00 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1db10 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1db20 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1db30 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1db40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1db50 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1db60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1db70 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1db80 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1db90 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1dba0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1dbb0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1dbc0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1dbd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1dbe0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1dbf0 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67  E_OK.   && (pPag
1dc00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1dc10 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1dc20 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1dc30 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1dc40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1dc50 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61  te3PagerSync(pPa
1dc60 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ger, 0);.  }.  i
1dc70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1dc90 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1dca0 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
1dcb0 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b  er[0]!='\0', 0);
1dcc0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1dcd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1dce0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1dcf0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1dd00 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1dd10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1dd20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1dd30 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1dd40 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1dd50 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1dd60 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1dd70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1dd80 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1dd90 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1dda0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1ddb0 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1ddc0 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1ddd0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1dde0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1ddf0 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62   isHot && nPlayb
1de00 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
1de10 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
1de20 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
1de30 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65  LBACK, "recovere
1de40 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20  d %d pages from 
1de50 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1de60 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20       nPlayback, 
1de70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1de80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
1de90 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1dea0 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
1deb0 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
1dec0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
1ded0 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
1dee0 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
1def0 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
1df00 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
1df10 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
1df20 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
1df30 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1df40 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
1df50 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
1df60 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1df70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1df80 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1df90 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
1dfa0 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1dfb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72  atabase file (or
1dfc0 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57   out of.** the W
1dfd0 41 4c 20 69 66 20 74 68 61 74 20 69 73 20 77 68  AL if that is wh
1dfe0 65 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ere the most rec
1dff0 65 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e  ent copy if foun
1e000 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  d) into .** pPg-
1e010 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1e020 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1e030 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1e040 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1e050 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1e060 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e070 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1e080 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1e090 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1e0a0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1e0b0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1e0c0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1e0d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e0e0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1e0f0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1e100 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1e110 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e120 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1e130 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1e140 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1e160 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1e170 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1e180 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e190 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1e1a0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1e1b0 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1e1c0 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63   pPg */.  int rc
1e1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e1e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e1f0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 69   code */.  u32 i
1e200 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
1e210 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
1e220 20 6f 66 20 57 41 4c 20 63 6f 6e 74 61 69 6e 69   of WAL containi
1e230 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73  ng pgno */..  as
1e240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e250 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1e260 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1e270 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1e280 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1e290 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
1e2a0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
1e2b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e2c0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e2d0 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e2e0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e2f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1e300 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1e310 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 72 63  iFrame ){.    rc
1e320 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1e330 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
1e340 57 61 6c 2c 20 69 46 72 61 6d 65 2c 70 50 61 67  Wal, iFrame,pPag
1e350 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 70 50 67  er->pageSize,pPg
1e360 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1e370 65 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73  e{.    i64 iOffs
1e380 65 74 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d  et = (pPg->pgno-
1e390 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1e3a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1e3b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1e3c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1e3d0 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  ->pData, pPager-
1e3e0 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73  >pageSize, iOffs
1e3f0 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  et);.    if( rc=
1e400 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1e410 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1e420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1e430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1e440 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  f( pPg->pgno==1 
1e450 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
1e460 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1e470 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
1e480 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
1e490 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
1e4a0 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
1e4b0 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
1e4c0 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
1e4d0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
1e4e0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
1e4f0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
1e500 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
1e510 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
1e520 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
1e530 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
1e540 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
1e550 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e560 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
1e570 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
1e580 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
1e590 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
1e5a0 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1e5b0 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
1e5c0 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
1e5d0 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
1e5e0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
1e5f0 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
1e600 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
1e610 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e620 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
1e630 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
1e640 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
1e650 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
1e660 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
1e670 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1e680 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
1e690 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
1e6a0 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
1e6b0 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
1e6c0 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  e equaling 16 by
1e6d0 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1e6e0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1e6f0 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1e700 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1e710 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1e720 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1e730 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1e740 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1e750 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1e760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e770 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1e780 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1e790 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1e7a0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1e7b0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1e7c0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1e7d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e7e0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1e7f0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1e800 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
1e810 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  ->pgno, 3, rc = 
1e820 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1e830 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  T);..  PAGER_INC
1e840 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1e850 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1e860 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1e870 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1e880 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1e890 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1e8a0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41  Pg->pgno));.  PA
1e8b0 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
1e8c0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1e8d0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1e8e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1e8f0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1e900 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1e910 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
1e920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e930 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 76  .** Update the v
1e940 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e  alue of the chan
1e950 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66  ge-counter at of
1e960 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32 20  fsets 24 and 92 
1e970 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  in.** the header
1e980 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20   and the sqlite 
1e990 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
1e9a0 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
1e9b0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e  ** This is an un
1e9c0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61  conditional upda
1e9d0 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68  te.  See also th
1e9e0 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  e pager_incr_cha
1e9f0 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20  ngecounter().** 
1ea00 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e  routine which on
1ea10 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
1ea20 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66  hange-counter if
1ea30 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20 61   the update is a
1ea40 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65  ctually.** neede
1ea50 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64  d, as determined
1ea60 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e   by the pPager->
1ea70 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1ea80 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a  state variable..
1ea90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eaa0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1eab0 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a  ecounter(PgHdr *
1eac0 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e  pPg){.  u32 chan
1ead0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f  ge_counter;..  /
1eae0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1eaf0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1eb00 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1eb10 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1eb20 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1eb30 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1eb40 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50  yte((u8*)pPg->pP
1eb50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1eb60 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73  )+1;.  put32bits
1eb70 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1eb80 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1eb90 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  counter);..  /* 
1eba0 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53  Also store the S
1ebb0 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75  QLite version nu
1ebc0 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39 36  mber in bytes 96
1ebd0 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a  ..99 and in.  **
1ebe0 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
1ebf0 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
1ec00 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
1ec10 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
1ec20 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69  ber.  ** is vali
1ec30 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  d. */.  put32bit
1ec40 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1ec50 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65  Data)+92, change
1ec60 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74  _counter);.  put
1ec70 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1ec80 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53  Pg->pData)+96, S
1ec90 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
1eca0 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  MBER);.}..#ifnde
1ecb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1ecc0 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  L./*.** This fun
1ecd0 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64  ction is invoked
1ece0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
1ecf0 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  age that has alr
1ed00 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72  eady been .** wr
1ed10 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c  itten into the l
1ed20 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57  og file when a W
1ed30 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  AL transaction i
1ed40 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
1ed50 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20  * Parameter iPg 
1ed60 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
1ed70 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e  er of said page.
1ed80 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65   The pCtx argume
1ed90 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c  nt .** is actual
1eda0 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
1edb0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1edc0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ure..**.** If pa
1edd0 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e  ge iPg is presen
1ede0 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  t in the cache, 
1edf0 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  and has no outst
1ee00 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
1ee10 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63  s,.** it is disc
1ee20 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  arded. Otherwise
1ee30 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f  , if there are o
1ee40 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
1ee50 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65  anding.** refere
1ee60 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63  nces, the page c
1ee70 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64  ontent is reload
1ee80 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
1ee90 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20  base. If the.** 
1eea0 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61  attempt to reloa
1eeb0 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  d content from t
1eec0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1eed0 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c  equired and fail
1eee0 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e  s, .** return an
1eef0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1ef00 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
1ef10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
1ef20 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64  tic int pagerUnd
1ef30 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  oCallback(void *
1ef40 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b  pCtx, Pgno iPg){
1ef50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ef60 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1ef70 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1ef80 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20  *)pCtx;.  PgHdr 
1ef90 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
1efa0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1efb0 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20  ger) );.  pPg = 
1efc0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1efd0 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
1efe0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1eff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
1f000 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
1f010 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
1f020 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1f030 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
1f040 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
1f050 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
1f060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f080 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
1f090 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
1f0a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f0b0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
1f0c0 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  l(pPg);.    }.  
1f0d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  }..  /* Normally
1f0e0 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
1f0f0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1f100 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
1f110 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
1f120 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
1f130 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
1f140 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1f150 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
1f160 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1f170 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
1f180 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
1f190 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
1f1a0 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
1f1b0 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
1f1c0 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
1f1d0 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
1f1e0 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
1f1f0 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
1f200 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
1f210 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1f220 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
1f230 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
1f240 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
1f250 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
1f260 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
1f270 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1f280 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
1f290 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
1f2a0 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
1f2b0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
1f2c0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
1f2d0 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ckup);..  return
1f2e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f2f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f300 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
1f310 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1f320 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
1f330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f340 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1f350 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1f360 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1f390 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  de */.  PgHdr *p
1f3a0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1f3b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1f3c0 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74  of dirty pages t
1f3d0 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f  o revert */..  /
1f3e0 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  * For all pages 
1f3f0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1f400 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
1f410 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c  dirty or have al
1f420 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
1f430 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74  written (but not
1f440 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74   committed) to t
1f450 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20  he log file, do 
1f460 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  one of the .  **
1f470 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
1f480 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72  .  **   + Discar
1f490 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67  d the cached pag
1f4a0 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d  e (if refcount==
1f4b0 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20  0), or.  **   + 
1f4c0 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  Reload page cont
1f4d0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1f4e0 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75  abase (if refcou
1f4f0 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50  nt>0)..  */.  pP
1f500 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1f510 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1f520 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1f530 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d  3WalUndo(pPager-
1f540 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f  >pWal, pagerUndo
1f550 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
1f560 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69  *)pPager);.  pLi
1f570 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1f580 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1f590 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1f5a0 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1f5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f5c0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1f5d0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1f5e0 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1f5f0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1f600 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1f610 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1f620 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1f630 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1f650 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1f660 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1f670 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1f680 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1f690 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1f6a0 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1f6b0 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1f6c0 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1f6d0 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1f6e0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1f6f0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1f700 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1f710 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1f720 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1f730 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1f740 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1f750 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1f760 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1f770 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1f780 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1f790 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1f7a0 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1f7b0 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1f7c0 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1f7d0 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1f7e0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1f7f0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1f800 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1f810 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1f820 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1f830 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1f840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1f850 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1f860 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1f870 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1f880 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1f890 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1f8a0 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1f8b0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1f8e0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1f8f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1f920 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69  ode */.  int nLi
1f930 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1f940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f950 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
1f960 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  List */.  PgHdr 
1f970 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1f980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1f990 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1f9a0 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ges */..  assert
1f9b0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29  ( pPager->pWal )
1f9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1f9d0 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  t );.#ifdef SQLI
1f9e0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
1f9f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
1fa00 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63  ge list is in ac
1fa10 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
1fa20 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1fa30 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20  p && p->pDirty; 
1fa40 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1fa50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e    assert( p->pgn
1fa60 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70  o < p->pDirty->p
1fa70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  gno );.  }.#endi
1fa80 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  f..  assert( pLi
1fa90 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c  st->pDirty==0 ||
1faa0 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69   isCommit );.  i
1fab0 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  f( isCommit ){. 
1fac0 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74     /* If a WAL t
1fad0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
1fae0 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  ing committed, t
1faf0 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1fb00 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20   in writing.    
1fb10 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74  ** any pages wit
1fb20 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1fb30 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75  reater than nTru
1fb40 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57  ncate into the W
1fb50 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  AL file..    ** 
1fb60 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  They will never 
1fb70 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63  be read by any c
1fb80 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65  lient. So remove
1fb90 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70   them from the p
1fba0 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73  Dirty.    ** lis
1fbb0 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50  t here. */.    P
1fbc0 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20  gHdr **ppNext = 
1fbd0 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73  &pList;.    nLis
1fbe0 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  t = 0;.    for(p
1fbf0 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74  =pList; (*ppNext
1fc00 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70   = p)!=0; p=p->p
1fc10 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66  Dirty){.      if
1fc20 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e  ( p->pgno<=nTrun
1fc30 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  cate ){.        
1fc40 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1fc50 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69  rty;.        nLi
1fc60 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st++;.      }.  
1fc70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1fc80 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  pList );.  }else
1fc90 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b  {.    nList = 1;
1fca0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61  .  }.  pPager->a
1fcb0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
1fcc0 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b  WRITE] += nList;
1fcd0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
1fce0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
1fcf0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1fd00 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20  er(pList);.  rc 
1fd10 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  = sqlite3WalFram
1fd20 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  es(pPager->pWal,
1fd30 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1fd40 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
1fd50 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f   nTruncate, isCo
1fd60 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61  mmit, pPager->wa
1fd70 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a  lSyncFlags.  );.
1fd80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fd90 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
1fda0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f  Backup ){.    fo
1fdb0 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1fdc0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1fdd0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1fde0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1fdf0 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20  ackup, p->pgno, 
1fe00 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b  (u8 *)p->pData);
1fe10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
1fe20 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1fe30 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20  PAGES.  pList = 
1fe40 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1fe50 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1fe60 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70  PCache);.  for(p
1fe70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  =pList; p; p=p->
1fe80 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67  pDirty){.    pag
1fe90 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
1fea0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  p);.  }.#endif..
1feb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fec0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65  /*.** Begin a re
1fed0 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
1fee0 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a  n the WAL..**.**
1fef0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1ff00 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
1ff10 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68  "pagerOpenSnapsh
1ff20 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74  ot()" because it
1ff30 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20   essentially.** 
1ff40 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74  makes a snapshot
1ff50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ff60 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
1ff70 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e  point in time an
1ff80 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74  d preserves.** t
1ff90 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72  hat snapshot for
1ffa0 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64   use by the read
1ffb0 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63  er in spite of c
1ffc0 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e  oncurrently chan
1ffd0 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20  ges by.** other 
1ffe0 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b  writers or check
1fff0 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  pointers..*/.sta
20000 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67  tic int pagerBeg
20010 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
20020 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
20030 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
20060 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e  de */.  int chan
20070 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ged = 0;        
20080 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20090 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  if cache must be
200a0 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73   reset */..  ass
200b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
200c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
200d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
200e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
200f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
20100 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
20110 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65   );..  /* sqlite
20120 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
20130 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74  action() was not
20140 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20   called for the 
20150 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72  previous.  ** tr
20160 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63  ansaction in loc
20170 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
20180 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74  IVE.  So call it
20190 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a   now.  If we.  *
201a0 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67  * are in locking
201b0 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64  _mode=NORMAL and
201c0 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70   EndRead() was p
201d0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
201e0 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69  ,.  ** the dupli
201f0 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72  cate call is har
20200 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  mless..  */.  sq
20210 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
20220 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
20230 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20  r->pWal);..  rc 
20240 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
20250 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
20260 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
20270 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20  changed);.  if( 
20280 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
20290 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20   changed ){.    
202a0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
202b0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45  er);.    if( USE
202c0 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20  FETCH(pPager) ) 
202d0 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
202e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20  (pPager->fd, 0, 
202f0 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
20300 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
20310 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20320 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
20330 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61   part of the tra
20340 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47  nsition from PAG
20350 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41  ER_OPEN.** to PA
20360 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
20370 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
20380 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
20390 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
203a0 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e  n pages (assumin
203b0 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
203c0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
203d0 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69   in Pager.pageSi
203e0 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ze)..**.** If no
203f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
20400 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20410 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a  rned and the siz
20420 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20430 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73  e.** in pages is
20440 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61   stored in *pnPa
20450 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ge. Otherwise, a
20460 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65  n error code (pe
20470 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  rhaps.** SQLITE_
20480 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20  IOERR_FSTAT) is 
20490 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e  returned and *pn
204a0 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d  Page is left unm
204b0 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
204c0 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
204d0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
204e0 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67  ger, Pgno *pnPag
204f0 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
20500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20510 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
20520 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
20530 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75  Page */..  /* Qu
20540 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d  ery the WAL sub-
20550 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64  system for the d
20560 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68  atabase size. Th
20570 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20  e WalDbsize().  
20580 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
20590 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20  rns zero if the 
205a0 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  WAL is not open 
205b0 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c  (i.e. Pager.pWal
205c0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66  ==0), or.  ** if
205d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
205e0 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ze is not availa
205f0 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73  ble. The databas
20600 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20  e size is not.  
20610 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ** available fro
20620 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
20630 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20  stem if the log 
20640 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72  file is empty or
20650 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e  .  ** contains n
20660 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65  o valid committe
20670 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
20680 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
20690 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
206a0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
206b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
206c0 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
206d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
206e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
206f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20700 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
20710 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20  =0 );.  nPage = 
20720 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
20730 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
20740 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d  .  /* If the num
20750 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
20760 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
20770 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
20780 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20  om the.  ** WAL 
20790 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65  sub-system, dete
207a0 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20 63  rmine the page c
207b0 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e 20 74 68  ount based on th
207c0 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74  e size of.  ** t
207d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
207e0 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  .  If the size o
207f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20800 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20  ile is not an.  
20810 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  ** integer multi
20820 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
20830 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74  size, round up t
20840 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
20850 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
20860 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28  & ALWAYS(isOpen(
20870 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
20880 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
208b0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
208c0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
208d0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
208e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
208f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20910 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20920 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
20930 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
20940 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
20950 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20960 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
20970 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
20980 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
20990 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
209a0 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
209b0 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
209c0 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
209d0 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
209e0 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
209f0 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
20a00 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
20a10 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
20a20 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
20a30 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
20a40 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
20a50 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
20a60 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
20a70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20a90 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
20aa0 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
20ab0 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
20ac0 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
20ad0 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
20ae0 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
20af0 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
20b00 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
20b10 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
20b20 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
20b30 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
20b40 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
20b50 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20b60 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
20b70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
20b80 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20b90 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
20ba0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
20bb0 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
20bc0 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
20bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20be0 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
20bf0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
20c00 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
20c10 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
20c20 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
20c30 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
20c40 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
20c50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
20c60 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20c70 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
20c80 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
20c90 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
20ca0 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
20cb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20cc0 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
20cd0 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
20ce0 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
20cf0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20d00 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
20d10 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
20d20 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
20d30 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
20d40 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
20d50 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
20d60 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
20d70 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
20d80 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
20d90 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
20da0 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
20db0 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
20dc0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
20dd0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
20de0 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
20df0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20e00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20e10 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
20e20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
20e30 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
20e40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20e50 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
20e60 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
20e70 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
20e80 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
20eb0 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
20ec0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20ed0 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20  3OsAccess(.     
20ee0 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20ef0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20f00 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20f10 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20f20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
20f30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20f40 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
20f50 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67         Pgno nPag
20f60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20f70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20f90 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 72 63  e */..        rc
20fa0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
20fb0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
20fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
20fd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20fe0 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
20ff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
21000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
21010 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
21020 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
21030 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
21040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74  lse{.          t
21050 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
21060 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
21070 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
21080 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
21090 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
210a0 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72  erOpenWal(pPager
210b0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
210c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
210d0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
210e0 61 6c 4d 6f 64 65 3e 3d 50 41 47 45 52 5f 4a 4f  alMode>=PAGER_JO
210f0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
21100 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21110 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
21120 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
21130 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
21140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21150 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
21160 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
21170 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
21180 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
21190 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
211a0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
211b0 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
211c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
211d0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
211e0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
211f0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
21200 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
21210 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
21220 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
21230 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
21240 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
21250 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
21260 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
21270 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
21280 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
21290 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
212a0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
212b0 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
212c0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
212d0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
212e0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
212f0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
21300 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
21310 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
21320 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
21330 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21340 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
21350 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
21360 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
21370 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
21380 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
21390 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
213a0 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
213b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
213c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
213d0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
213e0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
213f0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
21400 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
21410 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
21420 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
21430 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
21440 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
21450 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
21460 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
21470 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
21480 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
21490 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
214a0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
214b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
214c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
214d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
214e0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
214f0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
21500 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
21510 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
21520 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
21530 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
21540 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
21550 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
21560 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
21570 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
21580 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
21590 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
215a0 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
215b0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
215c0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
215d0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
215e0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
215f0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
21600 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
21610 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
21620 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
21630 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
21640 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
21650 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
21660 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
21670 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
21680 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
21690 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
216a0 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
216b0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
216c0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
216d0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
216e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
216f0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
21700 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
21710 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
21720 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
21730 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
21740 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
21750 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
21760 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
21770 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
21780 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
21790 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
217a0 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
217b0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
217c0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
217d0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
217e0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
217f0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
21800 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
21810 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
21820 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
21830 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21840 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
21850 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
21860 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
21870 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
21880 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
218a0 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
218b0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
218c0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
218d0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
218e0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
218f0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
21900 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
21910 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
21920 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
21930 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21940 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
21950 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
21960 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
21970 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
21980 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
21990 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
219a0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
219b0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
219c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
219d0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
219e0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
219f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
21a00 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
21a10 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
21a20 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21a30 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21a40 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
21a50 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
21a60 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
21a70 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
21a80 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
21a90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21aa0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
21ab0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
21ac0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
21ad0 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
21ae0 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
21af0 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
21b00 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
21b10 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
21b20 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
21b30 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
21b40 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
21b50 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
21b60 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
21b70 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
21b80 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
21b90 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
21ba0 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
21bb0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
21bc0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
21bd0 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
21be0 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
21bf0 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
21c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21c10 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
21c20 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
21c30 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
21c40 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
21c50 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
21c60 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
21c70 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
21c80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
21c90 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
21ca0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
21cb0 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
21cc0 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
21cd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21ce0 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
21cf0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
21d00 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
21d10 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
21d20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21d30 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
21d40 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
21d50 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
21d60 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
21d70 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21d80 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
21d90 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21da0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
21db0 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
21dc0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
21dd0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
21de0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
21df0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21e00 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
21e10 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
21e20 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
21e30 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
21e40 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
21e50 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
21e60 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21e70 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
21e80 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
21e90 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
21ea0 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
21eb0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
21ec0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21ed0 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
21ee0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21ef0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
21f00 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
21f10 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
21f20 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
21f30 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
21f40 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
21f50 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
21f60 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
21f70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
21f80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21f90 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
21fa0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21fb0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21fc0 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
21fd0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
21fe0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
21ff0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22000 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
22010 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22020 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
22030 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
22040 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
22050 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
22060 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
22070 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
22080 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
22090 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
220a0 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
220b0 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
220c0 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
220d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
220e0 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
220f0 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
22100 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
22110 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
22120 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
22130 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
22140 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
22150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22160 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22170 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
22180 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
22190 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
221a0 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
221b0 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
221c0 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
221d0 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
221e0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
221f0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
22200 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
22210 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
22220 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
22230 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
22240 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
22250 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
22260 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
22270 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
22280 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
22290 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
222a0 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
222b0 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
222c0 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
222d0 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
222e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
222f0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
22300 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
22310 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
22320 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
22330 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
22340 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
22350 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
22360 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
22370 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
22380 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
22390 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
223a0 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
223b0 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
223c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
223d0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
223e0 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
223f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22400 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
22410 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22420 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
22430 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
22440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22450 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
22460 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22470 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22480 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
22490 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
224a0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
224b0 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
224c0 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
224d0 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
224e0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
224f0 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
22500 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
22510 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
22520 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
22530 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
22540 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
22550 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
22560 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
22570 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
22580 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
22590 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
225a0 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
225b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
225c0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
225d0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
225e0 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e  = (i64)pSavepoin
225f0 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
22600 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
22610 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
22620 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
22630 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22640 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
22650 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
22660 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
22670 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
22680 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
22690 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
226a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
226b0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
226c0 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
226d0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
226e0 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67  =(i64)ii*(4+pPag
226f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
22700 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22710 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
22720 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
22730 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
22740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
22750 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22760 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
22770 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
22780 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
22790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
227a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
227b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
227c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
227d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
227e0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
227f0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
22800 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
22810 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
22820 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
22830 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20  o recycle clean 
22840 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73  and unused pages
22850 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22860 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
22870 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
22880 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
22890 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
228a0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
228b0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
228c0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ge);.}../*.** Ch
228d0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
228e0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
228f0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
22900 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
22910 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
22920 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20   to spill pages 
22930 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  to journal..*/.i
22940 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
22950 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65  etSpillsize(Page
22960 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
22970 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  xPage){.  return
22980 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
22990 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65  tSpillsize(pPage
229a0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
229b0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
229c0 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
229d0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65  L_MMAP_SIZE base
229e0 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
229f0 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70   value of szMmap
22a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22a10 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
22a20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22a30 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
22a40 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73  _MMAP_SIZE>0.  s
22a50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
22a60 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20  = pPager->fd;.  
22a70 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26  if( isOpen(fd) &
22a80 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  & fd->pMethods->
22a90 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20  iVersion>=3 ){. 
22aa0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
22ab0 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50   sz;.    sz = pP
22ac0 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20  ager->szMmap;.  
22ad0 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65    pPager->bUseFe
22ae0 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  tch = (sz>0);.  
22af0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
22b00 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73  d(pPager);.    s
22b10 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
22b20 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
22b30 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
22b40 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29  _MMAP_SIZE, &sz)
22b50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
22b60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
22b70 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
22b80 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
22b90 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
22ba0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22bb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22bc0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
22bd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
22be0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
22bf0 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  map){.  pPager->
22c00 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
22c10 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  .  pagerFixMapli
22c20 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  mit(pPager);.}..
22c30 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75  /*.** Free as mu
22c40 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
22c50 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70  sible from the p
22c60 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ager..*/.void sq
22c70 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
22c80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22c90 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
22ca0 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70  Shrink(pPager->p
22cb0 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
22cc0 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67  * Adjust setting
22cd0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74  s of the pager t
22ce0 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
22cf0 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73  d in the pgFlags
22d00 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
22d10 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e  * The "level" in
22d20 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
22d30 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
22d40 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73  K sets the robus
22d50 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tness.** of the 
22d60 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
22d70 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
22d80 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61  shes or power fa
22d90 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61  ilures by.** cha
22da0 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
22db0 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
22dc0 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  n writing the jo
22dd0 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65  urnals..** There
22de0 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73   are four levels
22df0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
22e00 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
22e10 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
22e20 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
22e30 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
22e40 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
22e50 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
22e60 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
22e70 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22e80 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22e90 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
22ea0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22eb0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
22ec0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
22ed0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
22ee0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
22ef0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
22f10 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
22f20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
22f30 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
22f40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22f50 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
22f60 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
22f70 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
22f80 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
22f90 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
22fa0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
22fb0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
22fc0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
22fe0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
22ff0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
23000 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
23010 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
23020 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
23030 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
23040 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
23050 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
23060 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
23070 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
23080 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
23090 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
230a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
230b0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
230c0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
230d0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
230e0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
230f0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
23100 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
23110 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
23120 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
23130 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
23140 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
23150 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
23160 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
23170 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
23180 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
23190 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
231a0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
231b0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
231c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
231d0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
231e0 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20  **.**    EXTRA  
231f0 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20     This is like 
23200 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74  FULL except that
23210 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74   is also syncs t
23220 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
23240 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72  t contains the r
23250 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
23260 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61  after the rollba
23270 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ck.**           
23280 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e     journal is un
23290 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  linked..**.** Th
232a0 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61  e above is for a
232b0 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
232c0 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c  l mode.  For WAL
232d0 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69   mode, OFF conti
232e0 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20  nues.** to mean 
232f0 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76  that no syncs ev
23300 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41  er occur.  NORMA
23310 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
23320 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a   WAL is synced.*
23330 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  * prior to the s
23340 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69  tart of checkpoi
23350 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  nt and that the 
23360 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23370 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68   synced.** at th
23380 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
23390 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
233a0 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  f the entire con
233b0 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a  tent of the WAL.
233c0 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62  ** was written b
233d0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
233e0 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73  abase.  But no s
233f0 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ync operations o
23400 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f  ccur for.** an o
23410 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69  rdinary commit i
23420 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69  n NORMAL mode wi
23430 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65  th WAL.  FULL me
23440 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c  ans that the WAL
23450 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63  .** file is sync
23460 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ed following eac
23470 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69  h commit operati
23480 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20  on, in addition 
23490 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20  to the.** syncs 
234a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
234b0 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69  NORMAL.  There i
234c0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
234d0 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20  between FULL.** 
234e0 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57 41  and EXTRA for WA
234f0 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f  L mode..**.** Do
23500 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e   not confuse syn
23510 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69  chronous=FULL wi
23520 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  th SQLITE_SYNC_F
23530 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ULL.  The.** SQL
23540 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61  ITE_SYNC_FULL ma
23550 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65  cro means to use
23560 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c   the MacOSX-styl
23570 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20  e full-fsync.** 
23580 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55  using fcntl(F_FU
23590 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54  LLFSYNC).  SQLIT
235a0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65  E_SYNC_NORMAL me
235b0 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20  ans to do an.** 
235c0 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29  ordinary fsync()
235d0 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73   call.  There is
235e0 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62   no difference b
235f0 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59  etween SQLITE_SY
23600 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53  NC_FULL.** and S
23610 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
23620 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f  L on platforms o
23630 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58  ther than MacOSX
23640 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79  .  But the.** sy
23650 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76  nchronous=FULL v
23660 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75  ersus synchronou
23670 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67  s=NORMAL setting
23680 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e   determines when
23690 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72  .** the xSync pr
236a0 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65  imitive is calle
236b0 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e  d and is relevan
236c0 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72  t to all platfor
236d0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ms..**.** Numeri
236e0 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
236f0 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
23700 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
23710 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
23720 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
23730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23740 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
23750 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23760 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67  rSetFlags(.  Pag
23770 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23780 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
23790 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65  to set safety le
237a0 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73  vel for */.  uns
237b0 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
237c0 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c     /* Various fl
237d0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ags */.){.  unsi
237e0 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46  gned level = pgF
237f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
23800 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20  CHRONOUS_MASK;. 
23810 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
23820 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
23830 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
23840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23850 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  lSync = 0;.    p
23860 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
23870 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23880 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e     pPager->noSyn
23890 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45  c =  level==PAGE
238a0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46  R_SYNCHRONOUS_OF
238b0 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  F ?1:0;.    pPag
238c0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
238d0 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43  evel>=PAGER_SYNC
238e0 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a  HRONOUS_FULL ?1:
238f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
23900 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c  xtraSync = level
23910 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  ==PAGER_SYNCHRON
23920 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a  OUS_EXTRA ?1:0;.
23930 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
23940 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
23950 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23960 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
23970 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
23980 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
23990 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
239a0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
239b0 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
239c0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
239d0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
239e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
239f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c   }.  pPager->wal
23a00 53 79 6e 63 46 6c 61 67 73 20 3d 20 28 70 50 61  SyncFlags = (pPa
23a10 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3c 3c  ger->syncFlags<<
23a20 32 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  2);.  if( pPager
23a30 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
23a40 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
23a50 63 46 6c 61 67 73 20 7c 3d 20 70 50 61 67 65 72  cFlags |= pPager
23a60 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 7d  ->syncFlags;.  }
23a70 0a 20 20 69 66 28 20 28 70 67 46 6c 61 67 73 20  .  if( (pgFlags 
23a80 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
23a90 4c 46 53 59 4e 43 29 20 26 26 20 21 70 50 61 67  LFSYNC) && !pPag
23aa0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
23ab0 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
23ac0 63 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54  cFlags |= (SQLIT
23ad0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c 32 29 3b  E_SYNC_FULL<<2);
23ae0 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61  .  }.  if( pgFla
23af0 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48 45  gs & PAGER_CACHE
23b00 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61  SPILL ){.    pPa
23b10 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23b20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  &= ~SPILLFLAG_OF
23b30 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  F;.  }else{.    
23b40 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23b50 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
23b60 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  OFF;.  }.}.#endi
23b70 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
23b80 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
23b90 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
23ba0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
23bb0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
23bc0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
23bd0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
23be0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
23bf0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
23c00 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
23c10 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
23c20 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
23c30 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
23c40 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
23c50 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
23c60 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
23c70 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
23c80 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
23c90 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
23ca0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
23cb0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
23cc0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
23cd0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
23ce0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
23cf0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
23d00 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
23d10 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
23d20 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
23d30 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
23d40 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
23d50 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
23d60 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
23d70 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
23d80 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
23d90 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
23da0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
23db0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
23dc0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
23dd0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
23de0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
23df0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
23e00 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
23e10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23e20 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
23e30 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
23e40 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
23e50 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
23e60 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
23e70 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
23e80 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
23e90 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23ea0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
23eb0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
23ec0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
23ed0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
23ee0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
23ef0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
23f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23f10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
23f20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23f30 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
23f40 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
23f50 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
23f60 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
23f70 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
23f80 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
23f90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23fa0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
23fb0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
23fc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
23fd0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
23fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
23ff0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
24000 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
24010 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
24020 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
24030 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
24040 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
24050 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
24060 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24070 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
24080 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
24090 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
240a0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
240b0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
240c0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
240d0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
240e0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
240f0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
24100 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
24110 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
24120 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
24130 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
24140 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
24150 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
24160 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
24170 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
24180 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
24190 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
241a0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
241b0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
241c0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
241d0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
241e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
241f0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
24200 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
24210 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
24220 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
24230 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
24240 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
24250 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
24260 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
24270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
242a0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
242b0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
242c0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
242d0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
242e0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
242f0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
24300 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
24310 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
24320 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
24330 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
24340 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
24350 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
24360 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
24370 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
24380 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
24390 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
243a0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
243b0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
243c0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
243d0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
243e0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
243f0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
24400 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
24410 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
24420 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
24430 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
24460 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
24470 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
24480 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
24490 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
244a0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
244b0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
244c0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
244d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
244e0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
244f0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
24500 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
24510 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
24520 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
24530 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
24540 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
24550 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
24560 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24570 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
24580 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
24590 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
245a0 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
245b0 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
245c0 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
245d0 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
245e0 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
245f0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
24600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
24610 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
24620 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
24630 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
24640 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
24650 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
24660 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
24670 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
24680 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
24690 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
246a0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
246b0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
246c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
246d0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
246e0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
246f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
24700 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
24710 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
24720 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
24730 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
24740 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
24750 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
24760 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
24770 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
24780 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
24790 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
247a0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
247b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
247c0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
247d0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
247e0 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
247f0 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
24800 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
24810 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
24820 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
24830 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
24840 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
24850 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
24860 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
24870 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24880 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
24890 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
248a0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
248b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
248c0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
248d0 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
248e0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
248f0 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
24900 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
24910 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
24920 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
24930 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
24940 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24950 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24960 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
24970 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24980 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
24990 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
249a0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
249b0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
249c0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
249d0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
249e0 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
249f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
24a00 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
24a10 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
24a20 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
24a30 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
24a40 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
24a50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24a60 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24a70 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
24a80 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
24a90 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
24aa0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
24ab0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
24ac0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
24ad0 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
24ae0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
24af0 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
24b00 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
24b10 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24b20 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24b30 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24b40 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24b50 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24b60 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24b70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24b80 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24b90 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24ba0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
24bb0 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
24bc0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24bd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24be0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
24bf0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
24c00 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
24c10 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24c20 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
24c30 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24c40 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24c50 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24c60 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24c70 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24c80 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24c90 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24ca0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
24cb0 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
24cc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24cd0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
24ce0 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
24cf0 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
24d00 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
24d10 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
24d20 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
24d30 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24d40 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24d50 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24d60 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
24d70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
24d80 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
24d90 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
24da0 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
24db0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
24dc0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
24dd0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
24de0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
24df0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
24e00 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
24e10 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
24e20 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
24e30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24e40 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
24e50 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24e60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24e70 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
24e80 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
24e90 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
24ea0 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
24eb0 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
24ec0 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
24ed0 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
24ee0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
24ef0 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
24f00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
24f10 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
24f20 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24f30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24f40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
24f50 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
24f60 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
24f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24f80 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
24f90 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
24fa0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
24fb0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
24fc0 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
24fd0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24fe0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
24ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25000 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
25010 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
25020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
25030 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
25040 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25050 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
25060 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25080 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
25090 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
250a0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
250b0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
250c0 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
250d0 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
250e0 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
250f0 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
25100 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
25110 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
25120 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
25130 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
25140 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
25150 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
25160 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
25170 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
25180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25190 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
251a0 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
251b0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
251c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
251d0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
251e0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
251f0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
25200 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
25210 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
25220 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
25230 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
25240 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
25250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25260 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25270 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
25280 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
25290 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
252a0 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
252b0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
252c0 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
252d0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
252e0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
252f0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
25300 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
25310 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
25320 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
25330 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
25340 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
25350 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
25360 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
25370 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
25380 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
25390 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
253a0 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
253b0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
253c0 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
253d0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
253e0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
253f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
25400 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
25410 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
25420 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
25430 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
25440 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
25450 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
25460 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
25470 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
25480 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
25490 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
254a0 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
254b0 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
254c0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
254d0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
254e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
254f0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
25500 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
25510 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
25520 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
25530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25540 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
25550 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
25560 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
25570 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
25580 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
25590 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
255a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
255b0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
255c0 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
255d0 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
255e0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
255f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25600 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
25610 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
25620 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
25630 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
25640 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
25650 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
25660 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
25670 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
25680 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
25690 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
256a0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
256b0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
256c0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
256d0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
256e0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
256f0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
25700 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
25710 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
25720 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
25730 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
25740 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
25750 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
25760 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
25770 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
25780 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
25790 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
257a0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
257b0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
257c0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
257d0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
257e0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
257f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25800 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25810 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
25820 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
25830 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
25840 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25850 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
25860 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25870 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
25880 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
25890 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
258a0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
258b0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
258c0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
258d0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
258e0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
258f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
25900 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
25910 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
25920 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
25930 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
25940 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
25950 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
25960 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
25970 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
25980 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
25990 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
259a0 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
259b0 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
259c0 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
259d0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
259e0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
259f0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
25a00 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25a10 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
25a20 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
25a30 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
25a40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25a50 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
25a60 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
25a70 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
25a80 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
25a90 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
25aa0 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
25ab0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
25ac0 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
25ad0 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
25ae0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
25af0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
25b00 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
25b10 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
25b20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
25b30 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25b40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25b50 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25b60 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25b80 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25b90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25ba0 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
25bb0 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
25bc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25bd0 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
25be0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
25bf0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
25c00 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
25c10 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
25c20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
25c30 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25c40 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
25c50 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25c60 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
25c70 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
25c80 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
25c90 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
25ca0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
25cb0 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
25cc0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25cd0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
25ce0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
25cf0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25d00 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
25d10 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
25d20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
25d30 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
25d40 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25d50 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25d60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25d70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25d80 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
25d90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25da0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25dc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
25dd0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
25de0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
25df0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
25e00 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
25e10 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
25e20 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
25e30 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
25e40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
25e50 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25e60 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
25e70 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
25e80 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25e90 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
25ea0 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
25eb0 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
25ec0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
25ed0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
25ee0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
25ef0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
25f00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
25f10 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
25f20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25f30 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
25f40 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
25f50 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
25f60 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
25f70 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
25f80 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
25f90 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
25fa0 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
25fb0 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
25fc0 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
25fd0 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
25fe0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
25ff0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26000 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
26010 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
26020 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
26030 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
26040 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
26050 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
26060 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
26070 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
26080 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
26090 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
260a0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
260b0 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
260c0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
260d0 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
260e0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
260f0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
26100 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
26110 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
26120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26130 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
26140 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
26150 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
26160 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
26170 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
26180 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
26190 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
261a0 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
261b0 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
261c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
261d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
261e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
261f0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
26200 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
26210 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
26220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26230 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26240 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
26250 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
26260 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
26270 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
26280 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
26290 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
262a0 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
262b0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
262c0 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
262d0 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
262e0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
262f0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
26300 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
26310 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
26320 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
26330 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
26340 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
26350 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
26360 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26370 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
26380 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
26390 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
263a0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
263b0 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
263c0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
263d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
263e0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
263f0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
26400 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
26410 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
26420 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
26430 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
26440 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
26450 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
26460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26470 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
26480 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26490 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
264a0 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
264b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
264c0 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
264d0 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
264e0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
264f0 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
26500 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
26510 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
26520 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
26530 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
26540 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
26550 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
26560 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
26570 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
26580 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
26590 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
265a0 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
265b0 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
265c0 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
265d0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
265e0 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
265f0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26600 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
26610 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
26620 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
26630 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
26640 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
26650 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
26660 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
26670 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
26680 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
26690 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
266a0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
266b0 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
266c0 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
266d0 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
266e0 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
266f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
26700 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
26710 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
26720 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
26730 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
26740 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
26750 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
26760 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
26770 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
26780 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
26790 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
267a0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
267b0 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
267c0 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
267d0 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
267e0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
267f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26800 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
26810 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
26820 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
26830 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
26840 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
26850 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
26860 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
26870 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
26880 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
26890 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
268a0 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
268b0 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
268c0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
268d0 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
268e0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
268f0 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
26900 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
26910 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
26920 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
26930 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
26940 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
26950 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
26960 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26970 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
26980 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
26990 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
269a0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
269b0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
269c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
269d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
269e0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
269f0 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
26a00 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26a10 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
26a20 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
26a30 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26a40 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
26a50 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
26a60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
26a70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
26a80 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
26a90 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
26aa0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
26ab0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
26ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26ad0 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
26ae0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
26af0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
26b00 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
26b10 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
26b20 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
26b30 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26b40 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26b50 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26b60 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26b70 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26b80 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26b90 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26bb0 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
26bc0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26bd0 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
26be0 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
26bf0 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
26c00 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
26c10 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
26c20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
26c30 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
26c40 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
26c50 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26c60 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
26c70 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
26c80 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
26c90 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
26ca0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
26cb0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
26cc0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26cd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
26ce0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
26cf0 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
26d00 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
26d10 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
26d20 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
26d30 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
26d40 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26d50 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26d60 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
26d70 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
26d80 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
26d90 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
26da0 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
26db0 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
26dc0 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
26dd0 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
26de0 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
26df0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
26e00 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
26e10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
26e20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
26e30 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
26e40 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
26e50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26e60 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
26e70 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26e80 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
26ea0 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
26eb0 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
26ec0 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
26ed0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
26ee0 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
26ef0 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
26f00 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
26f10 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
26f20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
26f30 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
26f40 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
26f50 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
26f60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26f70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26f80 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26f90 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
26fa0 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
26fb0 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
26fc0 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
26fd0 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
26fe0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
26ff0 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
27000 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27010 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
27020 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
27030 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
27040 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
27050 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
27060 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
27070 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
27080 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
27090 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
270a0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
270b0 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
270c0 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
270d0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
270e0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
270f0 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
27100 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
27110 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
27120 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
27130 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
27140 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
27150 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
27160 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
27170 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
27180 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
27190 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
271a0 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
271b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
271c0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
271d0 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
271e0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
271f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
27200 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27210 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
27220 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
27230 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
27240 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
27250 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
27260 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
27270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
27280 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
27290 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
272a0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
272b0 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
272c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
272d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
272e0 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74  SIZE>0./*.** Obt
272f0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
27300 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70  to a memory mapp
27310 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66  ed page object f
27320 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  or page number p
27330 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77  gno. .** The new
27340 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65   object will use
27350 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61   the pointer pDa
27360 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ta, obtained fro
27370 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49  m xFetch()..** I
27380 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
27390 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69  t *ppPage to poi
273a0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
273b0 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20  ge reference.** 
273c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
273d0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
273e0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
273f0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
27400 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20   set.** *ppPage 
27410 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50  to zero..**.** P
27420 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f  age references o
27430 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69  btained by calli
27440 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
27450 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61   should be relea
27460 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e  sed.** by callin
27470 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  g pagerReleaseMa
27480 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  pPage()..*/.stat
27490 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
274a0 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61  ireMapPage(.  Pa
274b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
274d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
274e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
274f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27500 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
27510 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61  r */.  void *pDa
27520 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
27530 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
27540 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74 68  ()'d data for th
27550 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
27560 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  dr **ppPage     
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27580 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70 61  OUT: Acquired pa
27590 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ge object */.){.
275a0 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
275b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275c0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
275d0 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75 72  ed page to retur
275e0 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50  n */.  .  if( pP
275f0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27600 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ist ){.    *ppPa
27610 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
27620 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
27630 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61      pPager->pMma
27640 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70  pFreelist = p->p
27650 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
27660 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  irty = 0;.    as
27670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45  sert( pPager->nE
27680 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d  xtra>=8 );.    m
27690 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c  emset(p->pExtra,
276a0 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b   0, 8);.  }else{
276b0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
276c0 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69   = (PgHdr *)sqli
276d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
276e0 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50  zeof(PgHdr) + pP
276f0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
27700 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
27710 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
27720 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
27730 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20  , (i64)(pgno-1) 
27740 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
27750 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  ze, pData);.    
27760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27770 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27780 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
27790 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
277a0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
277b0 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
277c0 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
277d0 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
277e0 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
277f0 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
27800 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
27810 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
27820 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
27830 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
27840 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
27850 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
27860 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
27870 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
27880 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
27890 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
278a0 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
278b0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
278c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
278d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
278e0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
278f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27900 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61  pPg. pPg must ha
27910 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64  ve been returned
27920 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69   by an .** earli
27930 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  er call to pager
27940 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29  AcquireMapPage()
27950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27960 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
27970 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
27980 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
27990 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
279a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  .  pPager->nMmap
279b0 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44  Out--;.  pPg->pD
279c0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
279d0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
279e0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
279f0 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20  elist = pPg;..  
27a00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27a10 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
27a20 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73  ersion>=3 );.  s
27a30 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
27a40 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
27a50 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70  )(pPg->pgno-1)*p
27a60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
27a70 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a   pPg->pData);.}.
27a80 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
27a90 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74  PgHdr objects st
27aa0 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65  ored in the Page
27ab0 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  r.pMmapFreelist 
27ac0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
27ad0 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61  void pagerFreeMa
27ae0 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61  pHdrs(Pager *pPa
27af0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
27b00 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  ;.  PgHdr *pNext
27b10 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
27b20 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27b30 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
27b40 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69    pNext = p->pDi
27b50 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rty;.    sqlite3
27b60 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
27b70 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
27b80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
27b90 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
27ba0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
27bb0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
27bc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
27bd0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
27be0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
27bf0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
27c00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
27c10 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
27c20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
27c30 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
27c40 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
27c50 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
27c60 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
27c70 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
27c80 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
27c90 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
27ca0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
27cb0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
27cc0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
27cd0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
27ce0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
27cf0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
27d00 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
27d10 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
27d20 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
27d30 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
27d40 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
27d50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
27d60 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
27d70 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
27d80 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
27d90 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
27da0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
27db0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
27dc0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
27dd0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
27de0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
27df0 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29  er, sqlite3 *db)
27e00 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
27e10 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
27e20 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
27e30 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73  t( db || pagerUs
27e40 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
27e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
27e60 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
27e70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73  pPager) );.  dis
27e80 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
27e90 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
27ea0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
27eb0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65  Malloc();.  page
27ec0 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61  rFreeMapHdrs(pPa
27ed0 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ger);.  /* pPage
27ee0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
27ef0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
27f00 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
27f10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27f20 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74  MIT_WAL.  assert
27f30 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ( db || pPager->
27f40 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  pWal==0 );.  sql
27f50 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
27f60 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70  ger->pWal, db, p
27f70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
27f80 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27f90 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64 62  eSize,.      (db
27fa0 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
27fb0 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e   SQLITE_NoCkptOn
27fc0 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54 6d  Close) ? 0 : pTm
27fd0 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72  p).  );.  pPager
27fe0 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
27ff0 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
28000 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28010 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
28020 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
28030 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28040 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
28050 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
28060 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
28070 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
28080 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
28090 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
280a0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
280b0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
280c0 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
280d0 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
280e0 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
280f0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
28100 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
28110 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
28120 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
28130 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
28140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
28150 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
28160 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
28170 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
28180 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
28190 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
281a0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
281b0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
281c0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
281d0 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
281e0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
281f0 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
28200 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
28210 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
28220 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
28230 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
28240 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
28250 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
28260 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
28270 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
28280 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
28290 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
282a0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
282b0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
282c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
282d0 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
282e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
282f0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
28300 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
28310 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
28320 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
28330 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
28340 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
28350 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
28360 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
28370 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
28380 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
28390 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
283a0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
283b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
283c0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
283d0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
283e0 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
283f0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
28400 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
28410 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
28420 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
28430 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
28440 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
28450 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28460 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
28470 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
28480 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
28490 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
284a0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
284b0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
284c0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
284d0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
284e0 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
284f0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
28500 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
28510 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
28520 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
28530 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
28540 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
28550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28560 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
28570 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
28580 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
28590 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
285a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
285b0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
285c0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
285d0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
285e0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
285f0 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
28600 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
28610 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
28620 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
28630 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
28640 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
28650 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
28660 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
28670 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
28680 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
28690 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
286a0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
286b0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
286c0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
286d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
286e0 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
286f0 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
28700 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
28710 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
28720 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
28730 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
28740 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
28750 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
28760 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
28770 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
28780 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
28790 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
287a0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
287b0 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
287c0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
287d0 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
287e0 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
287f0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
28800 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
28810 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
28820 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
28830 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
28840 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
28850 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
28860 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
28870 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
28880 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
28890 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
288a0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
288b0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
288c0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
288d0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
288e0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
288f0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
28900 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
28910 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
28920 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
28930 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
28940 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
28950 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
28960 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
28970 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
28980 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
28990 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
289a0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
289b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
289c0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
289d0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
289e0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
289f0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
28a00 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
28a10 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
28a20 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
28a30 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
28a40 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
28a50 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
28a60 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
28a70 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
28a80 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
28a90 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
28aa0 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
28ab0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
28ac0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
28ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
28ae0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
28af0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
28b00 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
28b10 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
28b20 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
28b30 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
28b40 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
28b50 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
28b60 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
28b70 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
28b80 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
28b90 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
28ba0 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
28bb0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
28bc0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
28bd0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
28be0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
28bf0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
28c00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
28c10 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
28c20 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
28c30 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
28c40 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
28c50 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28c80 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
28c90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
28ca0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
28cb0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
28cc0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
28cd0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
28ce0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
28cf0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
28d00 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
28d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
28d20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
28d30 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
28d40 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
28d50 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
28d60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28d70 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28d80 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
28d90 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
28da0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
28db0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
28dc0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
28dd0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
28de0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
28df0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28e00 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
28e10 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
28e20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
28e30 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
28e40 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
28e50 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
28e60 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28e70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
28e80 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28e90 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
28ea0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
28eb0 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
28ec0 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
28ed0 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
28ee0 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
28ef0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
28f00 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
28f10 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
28f20 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
28f30 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
28f40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
28f50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28f60 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
28f70 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
28f80 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
28f90 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
28fa0 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
28fb0 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
28fc0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
28fd0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
28fe0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
28ff0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
29000 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
29010 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
29020 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
29030 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
29040 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
29050 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
29060 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
29070 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
29080 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
29090 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
290a0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
290b0 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
290c0 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
290d0 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
290e0 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
290f0 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
29100 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
29110 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
29120 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
29130 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
29140 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
29150 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
29160 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
29170 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
29180 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
29190 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
291a0 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
291b0 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
291c0 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
291d0 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
291e0 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
291f0 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
29200 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
29210 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
29220 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
29230 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
29240 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
29250 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
29260 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
29270 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
29280 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
29290 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
292a0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
292b0 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
292c0 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
292d0 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
292e0 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
292f0 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
29300 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29310 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
29320 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
29330 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
29340 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
29350 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
29360 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
29370 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
29380 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
29390 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
293a0 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
293b0 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
293c0 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
293d0 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
293e0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
293f0 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
29400 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
29410 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
29420 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
29430 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
29440 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
29450 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
29460 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
29470 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
29480 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
29490 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
294a0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
294b0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
294c0 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
294d0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
294e0 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
294f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
29500 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
29510 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
29520 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
29530 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
29540 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
29550 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
29560 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
29570 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29580 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
29590 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
295a0 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
295b0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
295c0 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
295d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
295e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
295f0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
29600 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
29610 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
29620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29640 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
29650 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
29660 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
29670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29680 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
29690 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
296a0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
296b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
296c0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
296d0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
296e0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
296f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
29700 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
29710 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
29720 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
29730 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
29740 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
29750 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
29760 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
29770 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
29780 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
29790 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
297a0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
297b0 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
297c0 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
297d0 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
297e0 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
297f0 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
29800 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
29810 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
29820 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
29830 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
29840 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
29850 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
29860 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
29870 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
29880 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
29890 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
298a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
298b0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
298c0 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
298d0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
298e0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
298f0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
29900 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
29910 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
29920 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
29930 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
29940 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
29950 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
29960 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
29970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
29980 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
29990 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
299a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
299b0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
299c0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
299d0 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
299e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
299f0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29a00 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
29a10 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
29a20 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
29a30 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
29a40 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
29a50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29a60 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
29a70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
29a80 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
29a90 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
29aa0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29ab0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
29ac0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29ad0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29ae0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
29af0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
29b00 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
29b10 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
29b20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29b30 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
29b40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29b50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
29b60 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
29b70 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
29b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
29b90 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
29ba0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
29bb0 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
29bc0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
29bd0 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
29be0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
29bf0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
29c00 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
29c10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29c20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29c30 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
29c40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
29c50 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
29c60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
29c70 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
29c80 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
29c90 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
29ca0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
29cb0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
29cc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
29cd0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
29ce0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
29cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29d00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29d10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
29d20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
29d30 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
29d40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
29d50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
29d60 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
29d70 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
29d80 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
29d90 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
29da0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
29db0 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
29dc0 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
29dd0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
29de0 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
29df0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
29e00 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
29e10 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
29e20 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
29e30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
29e40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
29e50 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
29e60 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
29e70 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
29e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29e90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
29ea0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
29eb0 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
29ec0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
29ed0 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
29ee0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
29ef0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
29f00 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
29f10 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
29f20 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
29f30 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
29f40 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29f50 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
29f60 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
29f70 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
29f80 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
29f90 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
29fa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
29fb0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
29fc0 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
29fd0 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
29fe0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
29ff0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
2a000 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
2a010 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
2a020 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
2a030 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
2a040 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
2a050 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
2a060 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
2a070 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
2a080 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
2a090 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
2a0a0 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
2a0b0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
2a0c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a0d0 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
2a0e0 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
2a0f0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
2a100 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
2a110 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
2a120 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
2a130 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
2a140 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
2a150 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
2a160 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
2a170 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
2a180 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
2a190 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
2a1a0 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
2a1b0 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
2a1c0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2a1d0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2a1e0 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
2a1f0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
2a200 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
2a210 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
2a220 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
2a230 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2a240 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
2a250 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
2a260 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
2a270 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
2a280 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
2a290 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
2a2a0 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
2a2b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
2a2c0 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
2a2d0 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
2a2e0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
2a2f0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
2a300 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
2a310 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
2a320 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
2a330 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
2a340 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
2a350 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
2a360 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
2a370 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
2a380 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
2a390 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
2a3a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
2a3b0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2a3c0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2a3d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2a3e0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2a3f0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
2a400 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2a410 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
2a420 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
2a430 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
2a440 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
2a450 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
2a460 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2a470 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
2a480 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
2a490 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
2a4a0 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
2a4b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a4d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2a4e0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2a4f0 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
2a500 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
2a510 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
2a520 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
2a530 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
2a540 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2a550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2a560 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
2a570 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2a580 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
2a590 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
2a5a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
2a5b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
2a5c0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2a5d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2a5e0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d   pList->pDirty==
2a5f0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
2a600 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
2a610 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
2a620 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
2a630 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
2a640 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
2a650 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
2a660 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2a670 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
2a680 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
2a690 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
2a6a0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
2a6b0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
2a6c0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
2a6d0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2a6e0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
2a6f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
2a700 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
2a710 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
2a720 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
2a730 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2a740 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
2a750 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
2a760 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
2a770 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
2a780 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
2a790 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
2a7a0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
2a7b0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
2a7c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2a7d0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2a7e0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
2a7f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a800 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
2a810 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
2a820 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
2a830 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
2a840 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
2a850 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
2a860 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
2a870 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
2a880 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
2a890 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
2a8a0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
2a8b0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
2a8c0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
2a8d0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
2a8e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
2a8f0 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
2a900 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
2a910 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
2a920 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
2a930 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2a940 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2a950 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
2a960 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
2a970 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
2a980 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
2a990 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
2a9a0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
2a9b0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
2a9c0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
2a9d0 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
2a9e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
2a9f0 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
2aa00 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
2aa10 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
2aa20 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
2aa30 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
2aa40 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
2aa50 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
2aa60 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
2aa70 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
2aa80 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
2aa90 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
2aaa0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
2aab0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
2aac0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
2aad0 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
2aae0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2aaf0 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
2ab00 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
2ab10 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
2ab20 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
2ab30 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
2ab40 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
2ab50 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
2ab60 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
2ab70 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
2ab80 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
2ab90 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2aba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
2abd0 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
2abe0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
2abf0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
2ac00 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2ac10 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2ac20 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
2ac30 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
2ac40 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
2ac50 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
2ac60 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2ac70 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2ac80 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
2ac90 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
2aca0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2acb0 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  PT, pData);..   
2acc0 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
2acd0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
2ace0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2acf0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2ad00 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
2ad10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2ad20 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
2ad30 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
2ad40 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
2ad50 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
2ad60 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
2ad70 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
2ad80 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
2ad90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2ada0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
2adb0 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
2adc0 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
2add0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2ade0 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
2adf0 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
2ae00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
2ae10 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
2ae20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2ae30 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
2ae40 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
2ae50 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2ae60 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
2ae70 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
2ae80 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2ae90 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2aea0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
2aeb0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
2aec0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
2aed0 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
2aee0 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
2aef0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
2af00 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
2af10 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2af20 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
2af30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
2af40 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
2af50 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
2af60 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
2af70 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
2af80 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
2af90 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
2afa0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2afc0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2afd0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
2afe0 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
2aff0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
2b000 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
2b010 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2b020 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2b030 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2b040 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
2b050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
2b060 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
2b070 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
2b080 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b090 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
2b0a0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
2b0b0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
2b0c0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
2b0d0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
2b0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b0f0 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
2b100 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b110 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
2b120 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2b130 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
2b140 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2b150 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
2b160 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2b170 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
2b180 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
2b190 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
2b1a0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
2b1b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2b1c0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2b1d0 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2b1e0 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2b1f0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2b200 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2b210 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2b220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b230 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2b240 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2b250 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2b260 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  gs =  SQLITE_OPE
2b270 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53  N_SUBJOURNAL | S
2b280 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
2b290 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51  RITE .      | SQ
2b2a0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2b2b0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   | SQLITE_OPEN_E
2b2c0 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20  XCLUSIVE .      
2b2d0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
2b2e0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20  LETEONCLOSE;.   
2b2f0 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20   int nStmtSpill 
2b300 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
2b310 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
2b320 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2b330 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2b340 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2b350 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
2b360 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2b370 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20     nStmtSpill = 
2b380 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  -1;.    }.    rc
2b390 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
2b3a0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  lOpen(pPager->pV
2b3b0 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73  fs, 0, pPager->s
2b3c0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d  jfd, flags, nStm
2b3d0 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  tSpill);.  }.  r
2b3e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b3f0 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2b400 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2b410 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2b420 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2b430 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49  ournal. .**.** I
2b440 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2b450 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2b460 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2b470 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2b480 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2b490 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2b4a0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2b4b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2b4c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2b4d0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2b4e0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2b4f0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2b500 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2b510 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2b520 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2b530 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2b540 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2b550 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2b560 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2b570 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2b580 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2b590 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2b5a0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2b5b0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2b5c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b5d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2b5e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2b5f0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2b600 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2b610 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2b620 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2b630 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2b640 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2b650 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2b660 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b670 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2b680 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2b690 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2b6a0 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2b6b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2b6c0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2b6d0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2b6e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2b6f0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2b700 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2b710 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2b720 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2b730 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2b740 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2b750 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2b760 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2b770 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2b780 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2b790 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2b7a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2b7b0 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2b7c0 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2b7d0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2b7e0 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2b7f0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2b800 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2b810 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b830 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2b840 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2b850 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2b860 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2b870 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2b880 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2b890 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23 69  har *pData2;..#i
2b8a0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2b8b0 45 43 20 20 20 0a 20 20 20 20 20 20 69 66 28 20  EC   .      if( 
2b8c0 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d  !pPager->subjInM
2b8d0 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20  emory ){.       
2b8e0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2b8f0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2b900 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2b910 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
2b920 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d 65  Data2);.      }e
2b930 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
2b940 20 70 44 61 74 61 32 20 3d 20 70 44 61 74 61 3b   pData2 = pData;
2b950 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
2b960 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
2b970 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2b980 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2b990 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
2b9a0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2b9b0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66  bits(pPager->sjf
2b9c0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
2b9d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2b9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b9f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2ba00 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2ba10 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
2ba20 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
2ba30 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
2ba40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ba50 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2ba60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
2ba70 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
2ba80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ba90 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
2baa0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
2bab0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2bac0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
2bad0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
2bae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2baf0 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
2bb00 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50  PageIfRequired(P
2bb10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
2bb20 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2bb30 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72  ge(pPg) ){.    r
2bb40 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c  eturn subjournal
2bb50 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
2bb60 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
2bb70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
2bb80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2bb90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
2bba0 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
2bbb0 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
2bbc0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
2bbd0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
2bbe0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
2bbf0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
2bc00 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
2bc10 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
2bc20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
2bc30 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
2bc40 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
2bc50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
2bc60 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
2bc70 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
2bc80 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2bc90 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
2bca0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
2bcb0 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
2bcc0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2bcd0 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
2bce0 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
2bcf0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2bd00 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
2bd10 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
2bd20 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
2bd30 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
2bd40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2bd50 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
2bd60 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
2bd70 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
2bd80 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2bd90 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
2bda0 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
2bdb0 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
2bdc0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2bdd0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
2bde0 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
2bdf0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2be00 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
2be10 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
2be20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2be30 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2be40 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2be50 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
2be60 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
2be70 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
2be80 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
2be90 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
2bea0 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
2beb0 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
2bec0 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
2bed0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
2bee0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
2bef0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
2bf00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2bf10 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
2bf20 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
2bf30 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
2bf40 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
2bf50 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2bf60 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
2bf70 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
2bf80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2bf90 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
2bfa0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
2bfb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2bfc0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2bfd0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e  );..  /* The doN
2bfe0 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62  otSpill NOSYNC b
2bff0 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  it is set during
2c000 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e   times when doin
2c010 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a  g a sync of.  **
2c020 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64   journal (and ad
2c030 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65  ding a new heade
2c040 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  r) is not allowe
2c050 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a  d.  This occurs.
2c060 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c    ** during call
2c070 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
2c080 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74  rWrite() while t
2c090 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c  rying to journal
2c0a0 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70   multiple.  ** p
2c0b0 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74  ages belonging t
2c0c0 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  o the same secto
2c0d0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
2c0e0 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c   doNotSpill ROLL
2c0f0 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74  BACK and OFF bit
2c100 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  s inhibits all c
2c110 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20  ache spilling.  
2c120 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ** regardless of
2c130 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2c140 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2c150 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2c160 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72   during.  ** a r
2c170 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73  ollback or by us
2c180 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70  er request, resp
2c190 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20  ectively..  **. 
2c1a0 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2c1b0 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2c1c0 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2c1d0 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2c1e0 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2c1f0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2c200 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2c210 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2c220 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20  mentation it .  
2c230 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2c240 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2c250 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2c260 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2c270 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77  teFlag==3.  ** w
2c280 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2c290 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2c2a0 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2c2b0 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2c2c0 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2c2d0 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2c2e0 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2c2f0 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2c300 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2c310 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2c320 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2c330 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2c340 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2c350 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2c360 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2c370 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2c380 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65  E_OK;.  testcase
2c390 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2c3a0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2c3b0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74  _ROLLBACK );.  t
2c3c0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2c3d0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2c3e0 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20  ILLFLAG_OFF );. 
2c3f0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2c400 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2c410 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
2c420 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2c430 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20  ->doNotSpill.   
2c440 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e  && ((pPager->doN
2c450 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c  otSpill & (SPILL
2c460 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50  FLAG_ROLLBACK|SP
2c470 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30  ILLFLAG_OFF))!=0
2c480 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
2c490 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
2c4a0 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29  ED_SYNC)!=0).  )
2c4b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c4c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
2c4d0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
2c4e0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
2c4f0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
2c500 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67   /* Write a sing
2c510 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69  le frame for thi
2c520 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f  s page to the lo
2c530 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2c540 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2c550 65 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20  equired(pPg); . 
2c560 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2c580 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65   = pagerWalFrame
2c590 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30  s(pPager, pPg, 0
2c5a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
2c5b0 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66 64 65 66  lse{.    .#ifdef
2c5c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42   SQLITE_ENABLE_B
2c5d0 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
2c5e0 45 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  E.    if( pPager
2c5f0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  ->tempFile==0 ){
2c600 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c610 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2c620 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2c630 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c640 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
2c650 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2c660 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 23  er, rc);.    }.#
2c670 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 2f 2a 20  endif.  .    /* 
2c680 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
2c690 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
2c6a0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
2c6b0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2c6c0 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
2c6d0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2c6e0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
2c6f0 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
2c700 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
2c710 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
2c720 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2c730 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2c740 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2c750 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2c760 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2c770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c780 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2c790 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2c7a0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2c7b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2c7c0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2c7d0 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2c7e0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2c7f0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2c800 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2c810 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2c830 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2c840 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2c850 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2c860 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2c870 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2c880 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2c890 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2c8a0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2c8b0 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rc); .}../*.** F
2c8c0 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72  lush all unrefer
2c8d0 65 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65  enced dirty page
2c8e0 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  s to disk..*/.in
2c8f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c  t sqlite3PagerFl
2c900 75 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65  ush(Pager *pPage
2c910 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  r){.  int rc = p
2c920 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2c930 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2c940 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74      PgHdr *pList
2c950 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2c960 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2c970 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
2c980 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
2c990 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
2c9a0 72 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  r) );.    while(
2c9b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c9c0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  & pList ){.     
2c9d0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20   PgHdr *pNext = 
2c9e0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2c9f0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2ca00 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
2ca10 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72     rc = pagerStr
2ca20 65 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65  ess((void*)pPage
2ca30 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r, pList);.     
2ca40 20 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d   }.      pList =
2ca50 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20   pNext;.    }.  
2ca60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ca70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2ca80 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2ca90 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
2caa0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
2cab0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
2cac0 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
2cad0 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
2cae0 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
2caf0 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
2cb00 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2cb10 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
2cb20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
2cb30 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
2cb40 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
2cb50 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
2cb60 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
2cb70 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
2cb80 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
2cb90 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2cba0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
2cbb0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
2cbc0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
2cbd0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
2cbe0 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
2cbf0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
2cc00 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
2cc10 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
2cc20 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
2cc30 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
2cc40 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
2cc50 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
2cc60 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
2cc70 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
2cc80 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2cc90 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
2cca0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2ccb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
2ccc0 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
2ccd0 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
2cce0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
2ccf0 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
2cd00 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
2cd10 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2cd20 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
2cd30 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2cd40 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
2cd50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
2cd60 74 72 61 28 29 20 41 50 49 2e 20 20 57 68 65 6e  tra() API.  When
2cd70 20 61 20 6e 65 77 20 70 61 67 65 20 69 73 20 61   a new page is a
2cd80 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a 2a 2a  llocated, the.**
2cd90 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
2cda0 66 20 74 68 69 73 20 73 70 61 63 65 20 61 72 65  f this space are
2cdb0 20 7a 65 72 6f 65 64 20 62 75 74 20 74 68 65 20   zeroed but the 
2cdc0 72 65 6d 61 69 6e 64 65 72 20 69 73 20 75 6e 69  remainder is uni
2cdd0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28  nitialized..** (
2cde0 54 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  The extra space 
2cdf0 69 73 20 75 73 65 64 20 62 79 20 62 74 72 65 65  is used by btree
2ce00 20 61 73 20 74 68 65 20 4d 65 6d 50 61 67 65 20   as the MemPage 
2ce10 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54  object.).**.** T
2ce20 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2ce30 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2ce40 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2ce50 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2ce60 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2ce70 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2ce80 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2ce90 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2cea0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2ceb0 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2cec0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2ced0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2cee0 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2cef0 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2cf00 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2cf10 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2cf20 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2cf30 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2cf40 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2cf50 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2cf60 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2cf70 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2cf80 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2cf90 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2cfa0 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2cfb0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2cfc0 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2cfd0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2cfe0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2cff0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2d000 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2d010 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2d020 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2d030 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2d040 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2d050 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2d060 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2d070 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2d080 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2d090 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2d0a0 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2d0b0 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2d0c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2d0d0 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2d0e0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2d0f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2d100 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2d110 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2d120 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2d130 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2d140 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2d150 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2d160 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2d170 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2d180 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2d190 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2d1a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2d1b0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2d1c0 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2d1d0 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2d1e0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2d1f0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2d200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2d210 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2d220 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2d230 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2d240 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2d250 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2d260 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2d270 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2d280 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2d290 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2d2a0 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2d2b0 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2d2c0 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2d2d0 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2d2e0 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2d2f0 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2d300 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2d310 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d320 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2d330 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2d340 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2d350 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2d360 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2d370 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2d380 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2d390 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2d3a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d3b0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2d3c0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2d3d0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2d3e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d3f0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2d400 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2d410 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2d420 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2d430 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2d440 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2d450 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2d460 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2d470 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2d480 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2d490 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2d4a0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2d4b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2d4c0 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2d4d0 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2d4e0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2d4f0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2d500 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2d510 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2d520 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2d530 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2d540 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2d550 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2d560 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2d570 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2d580 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2d590 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2d5a0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2d5b0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2d5c0 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2d5d0 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2d5e0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2d5f0 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2d600 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2d610 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2d620 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2d630 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2d640 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2d650 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2d660 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2d670 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2d680 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2d690 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2d6a0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2d6b0 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2d6c0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d6d0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2d6e0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2d6f0 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2d700 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2d710 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2d720 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2d730 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2d740 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2d750 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2d760 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2d770 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2d780 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2d790 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2d7a0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2d7b0 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2d7c0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2d7d0 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2d7e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2d7f0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2d800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d810 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2d820 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2d830 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2d840 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2d850 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2d860 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2d870 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2d880 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2d890 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2d8a0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2d8b0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2d8c0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2d8d0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2d8e0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2d8f0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2d900 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2d910 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2d920 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2d930 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2d940 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2d950 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2d960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2d970 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2d980 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2d990 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2d9a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2d9b0 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2d9c0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2d9d0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2d9e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d9f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2da00 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2da10 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2da20 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2da30 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2da40 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2da50 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2da60 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2da70 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2da80 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2da90 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2daa0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2dab0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2dac0 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2dad0 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2dae0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2daf0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2db00 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2db10 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2db20 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2db30 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2db40 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2db50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2db60 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2db70 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2db80 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2db90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2dba0 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2dbb0 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2dbc0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2dbd0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2dbe0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2dbf0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2dc00 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2dc10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2dc20 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2dc30 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2dc40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2dc50 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2dc60 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2dc70 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2dc80 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2dc90 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2dca0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2dcb0 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2dcc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2dcd0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2dce0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2dcf0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2dd00 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2dd10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2dd20 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2dd30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2dd40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dd50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2dd60 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2dd70 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2dd80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2dd90 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2dda0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2ddb0 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2ddc0 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2ddd0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2dde0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2ddf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2de00 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2de10 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2de20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2de30 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2de40 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2de50 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2de60 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2de70 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2de80 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2de90 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2dea0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2deb0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2dec0 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2ded0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2dee0 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2def0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2df00 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2df10 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2df20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2df30 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2df40 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2df50 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2df60 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2df70 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2df80 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2df90 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2dfa0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2dfc0 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2dfd0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2dfe0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2dff0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e000 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2e010 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2e020 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2e030 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2e040 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2e050 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2e060 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2e070 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2e080 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2e090 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2e0a0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2e0b0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2e0c0 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2e0d0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2e0e0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2e0f0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2e100 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2e110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2e120 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2e130 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2e140 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2e150 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2e160 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2e170 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2e180 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2e190 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2e1a0 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2e1b0 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2e1c0 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2e1d0 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2e1e0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2e1f0 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2e200 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2e210 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2e220 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2e230 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e240 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2e250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e260 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2e270 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2e280 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2e290 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2e2a0 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2e2b0 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2e2c0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2e2d0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2e2e0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2e2f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2e300 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2e310 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2e320 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2e330 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2e340 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2e350 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2e360 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2e370 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2e380 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2e390 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2e3a0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2e3b0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2e3c0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2e3d0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2e3e0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2e3f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2e400 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2e410 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2e420 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2e430 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2e440 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2e450 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2e460 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2e470 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2e480 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2e490 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2e4a0 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2e4b0 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2e4c0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2e4d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2e4e0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2e4f0 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2e500 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2e510 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2e520 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2e530 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2e540 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2e550 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2e560 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2e570 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2e580 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2e590 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2e5a0 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2e5b0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2e5c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e5d0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2e5e0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2e5f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2e600 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2e610 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2e620 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2e630 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2e640 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2e650 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2e660 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2e670 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2e680 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2e690 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2e6a0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2e6b0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2e6c0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2e6d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2e6e0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2e6f0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2e700 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2e710 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2e720 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2e730 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2e740 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2e750 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2e760 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2e770 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2e780 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7a0 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2e7b0 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2e7c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2e7d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2e7e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2e7f0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2e800 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2e810 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2e820 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2e830 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2e840 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2e850 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2e860 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2e870 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2e880 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2e890 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2e8a0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2e8b0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2e8c0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2e8d0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2e8e0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2e8f0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2e900 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2e910 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2e920 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2e930 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2e940 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2e950 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2e960 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2e970 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2e980 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2e990 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2e9a0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2e9b0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2e9c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e9d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e9e0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2e9f0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2ea00 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2ea10 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >fd);.      if( 
2ea20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2ea30 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2ea40 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2ea50 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2ea60 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2ea70 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2ea80 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2ea90 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
2eaa0 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2eab0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2eac0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ead0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2eae0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2eaf0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2eb00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2eb10 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2eb20 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2eb30 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2eb40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2eb50 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2eb60 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2eb70 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2eb80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2eb90 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2eba0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2ebb0 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
2ebc0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2ebd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2ebe0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2ebf0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2ec00 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2ec10 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2ec20 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2ec30 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2ec40 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2ec50 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2ec60 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2ec70 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2ec80 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2ec90 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2eca0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2ecb0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2ecc0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2ecd0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2ece0 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50               szP
2ed00 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2ed10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ed20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ed30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
2ed40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2ed50 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  oLock = sqlite3_
2ed60 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2ed70 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c  ename, "nolock",
2ed80 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28   0);.      if( (
2ed90 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
2eda0 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30  AP_IMMUTABLE)!=0
2edb0 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2edc0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2edd0 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74  Filename, "immut
2ede0 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20  able", 0) ){.   
2edf0 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20         vfsFlags 
2ee00 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2ee10 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
2ee20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65     goto act_like
2ee30 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20  _temp_file;.    
2ee40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2ee50 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2ee60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2ee70 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2ee80 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2ee90 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2eea0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2eeb0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2eec0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2eed0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2eee0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2eef0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2ef00 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2ef10 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2ef20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2ef30 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2ef40 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2ef50 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2ef60 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2ef70 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2ef80 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2ef90 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2efa0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2efb0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2efc0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2efd0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2efe0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rnal..    **.   
2eff0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2f000 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69  also runs for fi
2f010 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d  les marked as im
2f020 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20  mutable..    */ 
2f030 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66  .act_like_temp_f
2f040 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c  ile:.    tempFil
2f050 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2f060 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2f070 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a  R_READER;     /*
2f080 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65   Pretend we alre
2f090 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20  ady have a lock 
2f0a0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
2f0b0 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2f0c0 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65  _LOCK;    /* Pre
2f0d0 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45  tend we are in E
2f0e0 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f  XCLUSIVE mode */
2f0f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  .    pPager->noL
2f100 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ock = 1;        
2f110 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2f120 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2f130 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2f140 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2f150 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2f160 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2f170 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2f180 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2f190 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2f1a0 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2f1b0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2f1c0 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2f1d0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2f1e0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2f1f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f200 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2f210 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2f220 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2f230 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2f240 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2f250 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2f260 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2f270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2f280 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2f290 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2f2a0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66   object. */.  if
2f2b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f2c0 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20  ){.    nExtra = 
2f2d0 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a  ROUND8(nExtra);.
2f2e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
2f2f0 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c  ra>=8 && nExtra<
2f300 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  1000 );.    rc =
2f310 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
2f320 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
2f330 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f350 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2f360 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2f370 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2f380 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2f390 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  }..  /* If an er
2f3a0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f  ror occurred abo
2f3b0 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61  ve, free the  Pa
2f3c0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
2f3d0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
2f3e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
2f3f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f400 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
2f410 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2f420 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
2f430 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
2f440 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ace);.    sqlite
2f450 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2f460 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2f470 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2f480 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2f490 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2f4a0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2f4b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2f4c0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2f4d0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2f4e0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2f4f0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2f500 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2f510 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2f520 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2f530 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2f540 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2f550 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2f560 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2f570 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f580 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2f590 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f5a0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2f5b0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f5c0 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2f5d0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2f5e0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2f5f0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2f600 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2f610 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
2f620 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
2f630 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
2f640 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
2f650 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
2f660 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
2f670 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2f680 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
2f690 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
2f6a0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2f6b0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2f6c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2f6d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2f6e0 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
2f6f0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2f700 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
2f710 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
2f720 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2f730 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
2f740 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
2f750 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
2f760 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
2f770 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
2f780 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20  Only;.  assert( 
2f790 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
2f7a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2f7b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
2f7c0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
2f7d0 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
2f7e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2f7f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2f800 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29  r->fullSync==0 )
2f810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f820 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d  ager->extraSync=
2f830 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2f840 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2f850 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2f860 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2f870 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2f880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
2f890 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
2f8a0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2f8b0 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
2f8c0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2f8d0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2f8e0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2f8f0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2f900 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2f910 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51 4c 49  C_NORMAL | (SQLI
2f920 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c  TE_SYNC_NORMAL<<
2f930 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  2);.  }.  /* pPa
2f940 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2f950 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f960 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2f970 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f980 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2f990 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2f9a0 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2f9b0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2f9c0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2f9d0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2f9e0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2f9f0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2fa00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2fa10 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2fa20 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2fa30 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2fa40 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2fa50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2fa60 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2fa70 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2fa80 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2fa90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2faa0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2fab0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2fac0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2fad0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2fae0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2faf0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2fb00 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2fb10 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2fb20 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2fb30 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
2fb40 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d  (pPager);.  /* m
2fb50 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2fb60 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2fb70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2fb80 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fb90 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  szMmap = SQLITE_
2fba0 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a  DEFAULT_MMAP_SIZ
2fbb0 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74  E // will be set
2fbc0 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a   by btree.c */..
2fbd0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2fbe0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2fbf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
2fc00 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2fc10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
2fc20 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  s not be deleted
2fc30 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20   or renamed out 
2fc40 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68  from.** under th
2fc50 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  e pager.  Return
2fc60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2fc70 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
2fc80 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68  ill were it ough
2fc90 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69  t.** to be on di
2fca0 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  sk.  Return non-
2fcb0 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41  zero (SQLITE_REA
2fcc0 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72  DONLY_DBMOVED or
2fcd0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
2fce0 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73  r.** code from s
2fcf0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2fd00 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
2fd10 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69  e has gone missi
2fd20 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2fd30 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  t databaseIsUnmo
2fd40 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  ved(Pager *pPage
2fd50 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f  r){.  int bHasMo
2fd60 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ved = 0;.  int r
2fd70 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
2fd80 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74  ->tempFile ) ret
2fd90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2fda0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2fdb0 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ize==0 ) return 
2fdc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2fdd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69  ert( pPager->zFi
2fde0 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72  lename && pPager
2fdf0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ->zFilename[0] )
2fe00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2fe10 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
2fe20 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2fe30 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
2fe40 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20  , &bHasMoved);. 
2fe50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fe60 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
2fe70 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f  /* If the HAS_MO
2fe80 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  VED file-control
2fe90 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65   is unimplemente
2fea0 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  d, assume that t
2feb0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68  he file.    ** h
2fec0 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65  as not been move
2fed0 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20  d.  That is the 
2fee0 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76  historical behav
2fef0 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70  ior of SQLite: p
2ff00 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76  rior to.    ** v
2ff10 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74  ersion 3.8.3, it
2ff20 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a   never checked *
2ff30 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
2ff40 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2ff50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ff60 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a  && bHasMoved ){.
2ff70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ff80 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2ff90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ffa0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
2ffb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ffc0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2ffd0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2ffe0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2fff0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
30000 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
30010 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
30020 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
30030 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
30040 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
30050 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
30060 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
30070 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
30080 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
30090 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
300a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
300b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
300c0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
300d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
300e0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
300f0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
30100 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30110 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
30120 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
30130 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
30140 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
30150 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
30160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
30170 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
30180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
30190 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
301a0 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
301b0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
301c0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
301d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
301e0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
301f0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
30200 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
30210 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
30220 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
30230 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
30240 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
30250 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
30260 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
30270 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
30280 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
30290 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
302a0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
302b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
302c0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
302d0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
302e0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
302f0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
30300 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
30310 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
30320 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
30330 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
30340 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
30350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
30360 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
30370 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
30380 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
30390 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
303a0 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
303b0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
303c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
303d0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
303e0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
303f0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
30400 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
30410 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
30420 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
30430 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
30440 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
30450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30460 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
30470 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
30480 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
30490 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
304a0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
304b0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
304c0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
304d0 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
304e0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
304f0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
30500 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
30510 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
30520 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
30530 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
30540 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
30550 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
30560 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
30570 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
30580 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
30590 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
305a0 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
305b0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
305c0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
305d0 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
305e0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
305f0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
30600 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
30610 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
30620 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
30630 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
30640 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
30650 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30660 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30670 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30680 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
30690 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
306a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
306b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
306c0 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
306d0 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
306e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
306f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
30700 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
30710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
30720 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
30730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30740 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30750 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
30760 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
30770 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
30780 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
30790 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
307a0 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
307b0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
307c0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
307d0 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
307e0 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
307f0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
30800 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
30810 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
30820 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
30830 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
30840 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
30850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30860 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
30870 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30890 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
308a0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
308b0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
308c0 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
308d0 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
308e0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
308f0 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
30900 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
30910 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
30920 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
30930 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
30940 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
30950 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
30960 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
30970 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
30980 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
30990 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
309a0 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
309b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
309c0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
309d0 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
309e0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
309f0 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
30a00 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
30a10 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
30a20 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
30a30 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
30a40 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
30a50 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
30a60 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
30a70 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
30a80 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
30a90 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
30aa0 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
30ab0 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
30ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30ad0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
30ae0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
30af0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
30b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30b10 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
30b20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30b40 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30b50 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
30b60 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
30b70 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
30b80 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  File==0 );.     
30b90 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
30ba0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
30bb0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30bd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
30be0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a  he database is z
30bf0 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a  ero pages in siz
30c00 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  e, that means th
30c10 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68  at either (1) th
30c20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
30c30 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e  rnal is a remnan
30c40 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64  t from a prior d
30c50 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
30c60 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65   same name where
30c70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
30c80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75  database file bu
30c90 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  t not the journa
30ca0 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f  l was deleted, o
30cb0 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61  r (2) the initia
30cc0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  l.        ** tra
30cd0 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f  nsaction that po
30ce0 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61  pulates a new da
30cf0 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20  tabase is being 
30d00 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
30d10 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65       ** In eithe
30d20 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72  r case, the jour
30d30 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20  nal file can be 
30d40 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65  deleted.  Howeve
30d50 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20  r, take care.   
30d60 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64       ** not to d
30d70 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
30d80 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
30d90 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65  already open due
30da0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a   to.        ** j
30db0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
30dc0 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  IST..        */.
30dd0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
30de0 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65  e==0 && !jrnlOpe
30df0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
30e00 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
30e10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
30e20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
30e30 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
30e40 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
30e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
30e70 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
30e80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
30e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30ea0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
30eb0 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
30ec0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
30ed0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30ee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30ef0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
30f00 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
30f10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30f20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
30f30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30f40 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
30f50 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
30f60 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
30f70 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
30f80 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30f90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
30fa0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
30fb0 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
30fc0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
30fd0 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
30fe0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
30ff0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
31000 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
31010 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
31020 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
31030 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
31040 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
31050 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
31060 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
31070 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31080 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
31090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
310a0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
310b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
310c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
310d0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
310e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
310f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
31100 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
31110 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
31120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
31130 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
31140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31150 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
31160 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
31170 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31180 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
31190 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
311a0 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
311b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
311c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
311d0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
311e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
311f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
31200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31210 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
31220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31230 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
31240 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31250 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31260 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
31270 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
31280 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
31290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
312a0 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
312b0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
312c0 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
312d0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
312e0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
312f0 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
31300 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20      ** it has a 
31310 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
31320 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
31330 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
31340 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
31350 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
31360 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
31370 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
31380 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
31390 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
313a0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
313b0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
313c0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
313d0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
313e0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
313f0 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
31400 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
31410 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
31420 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
31430 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
31440 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
31450 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
31460 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
31470 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
31480 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
31490 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
314a0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
314b0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
314c0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
314d0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
314e0 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
314f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31500 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
31510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31520 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
31530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31550 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
31560 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
31570 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
31580 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
31590 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
315a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
315b0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
315c0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
315d0 61 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20  agerGet() until 
315e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
315f0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
31600 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
31610 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
31620 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
31630 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
31640 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31650 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
31660 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
31670 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
31680 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
31690 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
316a0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
316b0 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
316c0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
316d0 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
316e0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
316f0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
31700 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
31710 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
31720 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
31730 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
31740 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
31750 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
31760 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
31770 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
31780 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
31790 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
317a0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
317b0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
317c0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
317d0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
317e0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
317f0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
31800 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
31810 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
31820 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
31830 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
31840 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
31850 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
31860 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
31870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31880 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
31890 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
318a0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
318b0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
318c0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
318d0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
318e0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
318f0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
31900 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
31910 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
31920 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
31930 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
31940 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
31950 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
31960 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
31970 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
31980 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
31990 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
319a0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
319b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
319c0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
319d0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
319e0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
319f0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
31a00 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
31a10 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
31a20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
31a30 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
31a40 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
31a50 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
31a60 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
31a70 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
31a80 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
31a90 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
31aa0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
31ab0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
31ac0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
31ad0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
31ae0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
31af0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
31b00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
31b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
31b30 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
31b40 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
31b50 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
31b60 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
31b70 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
31b80 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
31b90 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
31ba0 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
31bb0 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
31bc0 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
31bd0 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
31be0 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
31bf0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
31c00 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
31c10 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
31c20 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73  s mode.  */.  as
31c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
31c40 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
31c50 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
31c60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
31c70 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
31c80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
31c90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31ca0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31cb0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
31cc0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
31cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31ce0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
31cf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
31d00 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
31d10 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
31d20 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31d30 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
31d40 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
31d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
31d60 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
31d70 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
31d80 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
31d90 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
31da0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31db0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
31dc0 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
31dd0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
31de0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
31df0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
31e00 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
31e10 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
31e20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31e30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
31e40 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
31e50 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
31e60 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
31e70 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
31e80 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
31e90 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
31ea0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
31eb0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
31ec0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
31ed0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
31ee0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
31ef0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
31f00 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
31f10 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
31f20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
31f30 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
31f40 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
31f50 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
31f60 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
31f70 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
31f80 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
31f90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31fa0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31fb0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
31fc0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
31fd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
31fe0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
31ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
32000 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
32010 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32020 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
32030 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
32040 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
32050 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32060 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
32070 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
32080 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
32090 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
320a0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
320b0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
320c0 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
320d0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
320e0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
320f0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
32100 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
32110 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
32120 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
32130 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
32140 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
32150 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
32160 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
32170 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
32180 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
32190 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
321a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
321b0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
321c0 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
321d0 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
321e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
321f0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
32200 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
32210 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
32220 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
32230 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32240 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
32250 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
32260 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
32270 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
32280 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
32290 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
322a0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
322b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
322c0 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
322d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
322e0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
322f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
32300 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
32310 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
32320 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
32330 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
32340 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
32350 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
32360 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
32370 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
32380 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
32390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
323a0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
323b0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
323c0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
323d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
323e0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
323f0 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
32400 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
32410 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
32420 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
32430 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
32440 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
32450 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
32460 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
32470 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
32480 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
32490 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
324a0 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
324b0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
324c0 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
324d0 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
324e0 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
324f0 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
32500 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
32510 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
32520 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
32530 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
32540 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
32550 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
32560 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
32570 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
32580 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
32590 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
325a0 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
325b0 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
325c0 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
325d0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
325e0 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
325f0 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
32600 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
32610 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
32620 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
32630 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
32640 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
32650 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
32660 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
32670 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
32680 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
32690 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
326a0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
326b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
326c0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
326d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
326e0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
326f0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32700 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
32710 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
32720 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
32730 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
32740 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
32750 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
32760 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
32770 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
32780 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
32790 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
327a0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
327b0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
327c0 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
327d0 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
327e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
327f0 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
32800 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
32810 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
32820 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
32830 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
32840 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
32850 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
32860 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
32870 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
32880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32890 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
328a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
328b0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
328c0 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
328d0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
328e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
328f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
32900 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ) );.          i
32910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32920 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
32930 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
32940 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32950 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
32960 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
32970 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
32980 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
32990 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
329a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
329b0 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61  .      /* Playba
329c0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
329d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
329e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
329f0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  ite.      ** loc
32a00 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
32a10 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50  the read lock. P
32a20 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62  urge the cache b
32a30 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70  efore.      ** p
32a40 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
32a50 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74  hot-journal so t
32a60 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64  hat we don't end
32a70 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a   up with.      *
32a80 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  * an inconsisten
32a90 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74  t cache.  Sync t
32aa0 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62  he hot journal b
32ab0 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20  efore playing.  
32ac0 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73      ** it back s
32ad0 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73  ince the process
32ae0 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e   that crashed an
32af0 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a  d left the hot j
32b00 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
32b10 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74  probably did not
32b20 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20   sync it and we 
32b30 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
32b40 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20  always sync.    
32b50 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
32b60 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20   before playing 
32b70 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  it back..      *
32b80 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  /.      if( isOp
32b90 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
32ba0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32bb0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
32bd0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
32be0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
32bf0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32c10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
32c20 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
32c30 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
32c40 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  le);.          p
32c50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
32c60 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20  PAGER_OPEN;.    
32c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
32c80 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
32c90 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
32ca0 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c          pagerUnl
32cb0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
32cc0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
32cd0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
32ce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
32d00 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
32d10 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
32d20 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
32d30 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  to open.        
32d40 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20  ** or roll back 
32d50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68  a hot-journal wh
32d60 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ile holding an E
32d70 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
32d80 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
32d90 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75  ger_unlock() rou
32da0 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
32db0 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  led before retur
32dc0 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20  ning to unlock. 
32dd0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69         ** the fi
32de0 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63  le. If the unloc
32df0 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c  k attempt fails,
32e00 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63   then Pager.eLoc
32e10 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20  k must be.      
32e20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e    ** set to UNKN
32e30 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68  OWN_LOCK (see th
32e40 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
32e50 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20  the #define for 
32e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e  .        ** UNKN
32e70 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66  OWN_LOCK above f
32e80 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
32e90 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  n). .        **.
32ea0 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72          ** In or
32eb0 64 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72  der to get pager
32ec0 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20  _unlock() to do 
32ed0 74 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e  this, set Pager.
32ee0 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20  eState to.      
32ef0 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
32f00 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f   now. This is no
32f10 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74  t actually count
32f20 65 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69  ed as a transiti
32f30 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  on.        ** to
32f40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20   ERROR state in 
32f50 74 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61  the state diagra
32f60 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  m at the top of 
32f70 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20  this file,.     
32f80 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
32f90 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d  now that the sam
32fa0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
32fb0 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65  unlock() will ve
32fc0 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68  ry.        ** sh
32fd0 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e  ortly transition
32fe0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
32ff0 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74  t to the OPEN st
33000 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20  ate. Calling.   
33010 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70       ** assert_p
33020 61 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75  ager_state() wou
33030 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20  ld fail now, as 
33040 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
33050 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20   possible.      
33060 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52    ** to be in ER
33070 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
33080 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75  here are zero ou
33090 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a  tstanding page .
330a0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
330b0 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  ences..        *
330c0 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  /.        pager_
330d0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
330e0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
330f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
33100 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33110 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33120 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20  AGER_OPEN );.   
33130 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
33140 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  er->eLock==SHARE
33150 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20  D_LOCK).        
33160 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
33170 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
33180 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48  pPager->eLock>SH
33190 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
331a0 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
331b0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
331c0 46 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e  File && pPager->
331d0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
331e0 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  k ){.      /* Th
331f0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
33200 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
33210 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20  ired then check 
33220 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
33230 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33240 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
33250 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
33260 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
33270 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
33280 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  the cache.  The 
33290 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
332a0 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20  k flag prevents 
332b0 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20  this from.      
332c0 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20  ** occurring on 
332d0 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61  the very first a
332e0 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c  ccess to a file,
332f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76   in order to sav
33300 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  e a.      ** sin
33310 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  gle unnecessary 
33320 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
33330 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72  call at the star
33340 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  t-up..      **. 
33350 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
33360 20 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74   changes are det
33370 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
33380 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
33390 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
333a0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
333b0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
333c0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
333d0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
333e0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
333f0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
33400 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
33410 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
33420 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
33430 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
33440 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
33450 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
33460 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
33470 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
33480 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
33490 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
334a0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
334b0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
334c0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
334d0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
334e0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
334f0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
33500 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
33510 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
33520 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
33530 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
33540 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
33550 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
33560 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
33570 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54 52 41  )];..      IOTRA
33580 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
33590 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
335a0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
335b0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
335c0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
335d0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
335e0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
335f0 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
33600 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33630 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
33640 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  D ){.          g
33650 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
33660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
33670 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
33680 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
33690 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
336a0 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
336b0 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
336c0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
336d0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
336e0 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
336f0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
33700 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  (pPager);..     
33710 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20     /* Unmap the 
33720 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
33730 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
33740 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63  at external proc
33750 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  esses.        **
33760 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61   may have trunca
33770 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ted the database
33780 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65   file and then e
33790 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a  xtended it back.
337a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74          ** to it
337b0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
337c0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
337d0 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69  ss was not holdi
337e0 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  ng a lock..     
337f0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
33800 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69  se there may exi
33810 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20  st a Pager.pMap 
33820 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70  mapping that app
33830 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ears.        ** 
33840 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20  to be the right 
33850 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20  size but is not 
33860 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20  actually valid. 
33870 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20  Avoid this.     
33880 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74     ** possibilit
33890 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74  y by unmapping t
338a0 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20  he db here. */. 
338b0 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45         if( USEFE
338c0 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20  TCH(pPager) ){. 
338d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
338e0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
338f0 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
33900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33910 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
33920 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
33930 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
33940 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
33950 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
33960 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
33970 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
33980 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
33990 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
339a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
339b0 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
339c0 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
339d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
339e0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
339f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
33a00 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
33a10 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
33a20 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
33a30 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33a40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
33a50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
33a60 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
33a70 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
33a80 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
33a90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
33aa0 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61  mpFile==0 && pPa
33ab0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33ac0 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53  ER_OPEN && rc==S
33ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33ae0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
33af0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61  unt(pPager, &pPa
33b00 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
33b10 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
33b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33b30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
33b40 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67  MEMDB );.    pag
33b50 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
33b60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33b70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33b80 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d  AGER_OPEN );.  }
33b90 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
33ba0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
33bb0 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
33bc0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
33bd0 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  edLock = 1;.  }.
33be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33bf0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
33c00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
33c10 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
33c20 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
33c30 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
33c40 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
33c50 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
33c60 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
33c70 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
33c80 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
33c90 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
33ca0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
33cb0 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
33cc0 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
33cd0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
33ce0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
33cf0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
33d00 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
33d10 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
33d20 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
33d30 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
33d40 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  ger){.  if( sqli
33d50 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
33d60 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
33d70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
33d80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  ert( pPager->nMm
33d90 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a 20 62  apOut==0 ); /* b
33da0 65 63 61 75 73 65 20 70 61 67 65 31 20 69 73 20  ecause page1 is 
33db0 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70  never memory map
33dc0 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ped */.    pager
33dd0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
33de0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
33df0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
33e00 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 73 20   getter methods 
33e10 65 61 63 68 20 74 72 79 20 74 6f 20 61 63 71 75  each try to acqu
33e20 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
33e30 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77 69 74  to a.** page wit
33e40 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67  h page number pg
33e50 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  no. If the reque
33e60 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
33e70 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
33e80 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
33e90 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
33ea0 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
33eb0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
33ec0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64 69 66  ** There are dif
33ed0 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  ferent implement
33ee0 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 67 65  ations of the ge
33ef0 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65 70 65  tter method depe
33f00 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  nding.** on the 
33f10 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
33f20 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
33f30 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e 6f 72  *     getPageNor
33f40 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20 2d 2d  mal()         --
33f50 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67 65 74    The normal get
33f60 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74 50 61  ter.**     getPa
33f70 67 65 45 72 72 6f 72 28 29 20 20 20 20 20 20 20  geError()       
33f80 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 74     --  Used if t
33f90 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
33fa0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  n error state.**
33fb0 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d 61 70       getPageMmap
33fc0 28 29 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  ()           -- 
33fd0 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72 79 2d   Used if memory-
33fe0 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20 65 6e  mapped I/O is en
33ff0 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74  abled.**.** If t
34000 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
34010 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
34020 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
34030 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
34040 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
34050 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
34060 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
34070 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
34080 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
34090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
340a0 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
340b0 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
340c0 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
340d0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
340e0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
340f0 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
34100 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
34110 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
34120 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
34130 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
34140 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
34150 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
34160 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
34170 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
34180 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
34190 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
341a0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
341b0 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
341c0 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
341d0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
341e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
341f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
34200 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
34210 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
34220 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
34230 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
34240 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
34250 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
34260 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
34270 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
34280 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
34290 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20 70 61  .** the flags pa
342a0 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69 6e 73  rameter contains
342b0 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
342c0 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61 6e 64  OCONTENT bit and
342d0 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
342e0 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
342f0 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
34300 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
34310 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
34320 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
34330 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34340 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
34350 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
34360 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
34370 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
34380 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f  ** If PAGER_GET_
34390 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75  NOCONTENT is tru
343a0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
343b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
343c0 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
343d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
343e0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
343f0 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
34400 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
34410 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
34420 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
34430 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
34440 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
34450 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
34460 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
34470 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
34480 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
34490 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
344a0 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
344b0 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
344c0 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
344d0 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
344e0 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
344f0 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
34500 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
34510 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
34520 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73  data returned is
34530 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 0a   zeroed instead.
34540 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ** of being read
34550 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
34560 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
34570 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65  , the bits corre
34580 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
34590 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  gno in Pager.pIn
345a0 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20  Journal (bitvec 
345b0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
345c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
345d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ** journal file)
345e0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
345f0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
34600 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20  oint bitvecs of 
34610 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65  any open.** save
34620 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20  points are set. 
34630 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68  This means if th
34640 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77  e page is made w
34650 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a  ritable at any.*
34660 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  * point in the f
34670 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63  uture, using a c
34680 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
34690 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20  gerWrite(), its 
346a0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c  contents.** will
346b0 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65   not be journale
346c0 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f  d. This saves IO
346d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
346e0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
346f0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
34700 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
34710 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
34720 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
34730 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
34740 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
34750 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
34760 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
34770 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
34780 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
34790 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
347a0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
347b0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
347c0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
347d0 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
347e0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
347f0 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
34800 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
34810 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
34820 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
34830 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
34840 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
34850 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
34860 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
34870 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
34880 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
34890 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
348a0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
348b0 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
348c0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
348d0 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
348e0 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
348f0 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
34900 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
34910 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
34920 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61  al files..*/.sta
34930 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e  tic int getPageN
34940 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72 20 2a  ormal(.  Pager *
34950 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
34960 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
34970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34980 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
34990 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
349a0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
349b0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
349c0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
349d0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
349e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
349f0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
34a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
34a10 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
34a20 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
34a30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
34a40 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 75 38  PgHdr *pPg;.  u8
34a50 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20 20 20   noContent;     
34a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a70 20 54 72 75 65 20 69 66 20 50 41 47 45 52 5f 47   True if PAGER_G
34a80 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
34a90 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  set */.  sqlite3
34aa0 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42  _pcache_page *pB
34ab0 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ase;..  assert( 
34ac0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
34ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
34ae0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34af0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
34b00 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
34b10 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
34b20 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
34b30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34b40 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
34b50 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  ock==1 );..  if(
34b60 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72   pgno==0 ) retur
34b70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
34b80 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d  _BKPT;.  pBase =
34b90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34ba0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34bb0 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
34bc0 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
34bd0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
34be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
34bf0 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28  acheFetchStress(
34c00 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34c10 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a   pgno, &pBase);.
34c20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34c30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34c40 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34c50 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
34c60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
34c70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
34c80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
34c90 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34ca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20      }.  }.  pPg 
34cb0 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
34cc0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
34cd0 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
34ce0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
34cf0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
34d00 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a  g==(*ppPage) );.
34d10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34d20 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
34d30 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
34d40 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
34d50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
34d60 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  .  noContent = (
34d70 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
34d80 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b  T_NOCONTENT)!=0;
34d90 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
34da0 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
34db0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
34dc0 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
34dd0 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
34de0 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
34df0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
34e00 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
34e10 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
34e20 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
34e30 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
34e40 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
34e50 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
34e60 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
34e70 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34e80 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
34e90 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
34ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
34eb0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
34ec0 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
34ed0 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
34ee0 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
34ef0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
34f00 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
34f10 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65  But first some e
34f20 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20  rror checks:.   
34f30 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54   **.    ** (1) T
34f40 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
34f50 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20  number is 2^31. 
34f60 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20     ** (2) Never 
34f70 74 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65  try to fetch the
34f80 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20   locking page.  
34f90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
34fa0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
34fb0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
34fc0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34fd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34fe0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34ff0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
35000 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35010 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
35020 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
35030 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ;..    assert( !
35040 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
35050 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  d) || !MEMDB );.
35060 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
35070 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
35080 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
35090 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
350a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
350b0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
350c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
350d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
350e0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
350f0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
35100 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35110 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
35120 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
35130 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
35140 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
35150 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
35160 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
35170 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
35180 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
35190 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
351a0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
351b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
351c0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
351d0 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
351e0 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
351f0 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
35200 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
35210 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
35220 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
35230 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
35240 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
35250 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
35260 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
35270 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35280 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
35290 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
352a0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
352b0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
352c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
352d0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
352e0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
352f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
35300 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
35310 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35320 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35330 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35340 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
35350 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
35360 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
35370 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
35380 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
35390 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
353a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
353b0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
353c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
353d0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
353e0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
353f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
35400 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
35410 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
35420 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
35430 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
35440 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
35450 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
35460 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
35470 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b  ER_STAT_MISS]++;
35480 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
35490 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
354a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
354b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
354c0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
354d0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
354e0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
354f0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
35500 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
35520 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
35530 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35540 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
35550 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
35560 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
35570 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
35580 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
35590 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  ger);.  *ppPage 
355a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
355b0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
355c0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
355d0 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
355e0 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f  er for when memo
355f0 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
35600 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
35610 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
35620 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ap(.  Pager *pPa
35630 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
35640 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
35650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35660 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
35670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35680 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
35690 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
356a0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
356b0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
356c0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
356d0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
356e0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
356f0 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
35700 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
35710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
35720 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
35730 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
35740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35750 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
35760 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
35770 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
35780 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
35790 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
357a0 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
357b0 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
357c0 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
357d0 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
357e0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
357f0 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
35800 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
35810 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
35820 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
35830 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
35840 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
35850 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
35860 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
35870 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
35880 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
35890 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65  o>1.   && (pPage
358a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
358b0 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
358c0 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
358d0 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
358e0 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43   assert( USEFETC
358f0 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66  H(pPager) );.#if
35900 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
35910 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70  ODEC.  assert( p
35920 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
35930 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
35940 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
35950 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
35960 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
35970 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
35980 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
35990 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
359a0 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
359b0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
359c0 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
359d0 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
359e0 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
359f0 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
35a00 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
35a10 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
35a20 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
35a30 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
35a40 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
35a50 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
35a60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35a70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
35a80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35a90 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
35aa0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
35ab0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35ac0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
35ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35ae0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
35af0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
35b00 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35b10 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
35b20 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
35b30 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
35b40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
35b50 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
35b60 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
35b70 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
35b80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
35b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35ba0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
35bb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35bc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35bd0 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
35be0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69  me==0 ){.    voi
35bf0 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  d *pData = 0;.  
35c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35c10 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
35c20 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29  , .        (i64)
35c30 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
35c40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
35c50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
35c60 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20  pData.    );.   
35c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35c80 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
35c90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
35ca0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
35cb0 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
35cc0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
35cd0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
35ce0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
35cf0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
35d00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
35d10 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
35d20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
35d30 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
35d40 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
35d50 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b  Pg);.     }else{
35d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35d70 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
35d80 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
35d90 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
35da0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
35db0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35dc0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPg ){.        a
35dd0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
35de0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
35df0 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
35e00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
35e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
35e20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
35e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35e40 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
35e50 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
35e60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
35e70 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f  return getPageNo
35e80 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e  rmal(pPager, pgn
35e90 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
35ea0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
35eb0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
35ec0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65  IZE>0 */../* The
35ed0 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
35ee0 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65  hod for when the
35ef0 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72 72   pager is an err
35f00 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74  or state */.stat
35f10 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72  ic int getPageEr
35f20 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ror(.  Pager *pP
35f30 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
35f40 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
35f50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35f60 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
35f70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
35f80 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
35f90 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
35fa0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
35fb0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
35fc0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
35fd0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
35fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
35ff0 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
36000 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
36010 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a  ARAMETER(pgno);.
36020 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36030 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73  ER(flags);.  ass
36040 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
36050 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
36060 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
36070 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
36080 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a  r->errCode;.}...
36090 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20  /* Dispatch all 
360a0 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75 65  page fetch reque
360b0 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f  sts to the appro
360c0 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d 65  priate getter me
360d0 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  thod..*/.int sql
360e0 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
360f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
36100 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
36110 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
36120 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
36130 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
36140 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36150 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
36160 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
36170 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
36180 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
36190 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
361a0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
361b0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
361c0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
361d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
361e0 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  xGet(pPager, pgn
361f0 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
36200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
36210 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
36220 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
36230 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
36240 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
36250 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
36260 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
36270 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
36280 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
36290 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
362a0 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
362b0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
362c0 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
362d0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
362e0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
362f0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
36300 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
36310 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
36320 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
36330 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
36340 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
36350 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
36360 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
36370 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
36380 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
36390 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
363a0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
363b0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
363c0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
363d0 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
363e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
363f0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
36400 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
36410 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
36420 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
36430 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
36440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
36450 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
36460 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
36470 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
36480 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
36490 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
364a0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
364b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d    assert( pPage=
364c0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61  =0 || pPager->ha
364d0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
364e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  );.  if( pPage==
364f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
36500 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
36510 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
36520 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
36530 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d   pgno, pPage);.}
36540 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
36550 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
36560 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
36570 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
36580 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
36590 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29 20 6d  UnrefNotNull() m
365a0 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75 73  ay only be.** us
365b0 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20 74 68  ed if we know th
365c0 61 74 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  at the page bein
365d0 67 20 72 65 6c 65 61 73 65 64 20 69 73 20 6e 6f  g released is no
365e0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 2e  t the last page.
365f0 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20 6c 61  .** The btree la
36600 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c 64 73  yer always holds
36610 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e 74 69   page1 open unti
36620 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20 74 68  l the end, so th
36630 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 20  ese first.** to 
36640 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62 65 20  routines can be 
36650 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73 65 20  used to release 
36660 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72 20 74  any page other t
36670 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70 50 61  han BtShared.pPa
36680 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 73  ge1..**.** Use s
36690 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
366a0 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72 65 6c  PageOne() to rel
366b0 65 61 73 65 20 70 61 67 65 31 2e 20 20 54 68 69  ease page1.  Thi
366c0 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69 6e 65  s latter routine
366d0 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65 20 74  .** checks the t
366e0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f  otal number of o
366f0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
36700 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75 6d 62   and if the numb
36710 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 72  er of.** pages r
36720 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74 20 64  eaches zero it d
36730 72 6f 70 73 20 74 68 65 20 64 61 74 61 62 61 73  rops the databas
36740 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  e lock..*/.void 
36750 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36760 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20  fNotNull(DbPage 
36770 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f 4e 4c  *pPg){.  TESTONL
36780 59 28 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  Y( Pager *pPager
36790 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
367a0 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ).  assert( pPg!
367b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  =0 );.  if( pPg-
367c0 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
367d0 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73 65 72  MAP ){.    asser
367e0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 31 20  t( pPg->pgno!=1 
367f0 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69 73 20  );  /* Page1 is 
36800 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61 70  never memory map
36810 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ped */.    pager
36820 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
36830 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
36840 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
36850 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
36860 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65  .  /* Do not use
36870 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
36880 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 61 73   release the las
36890 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  t reference to p
368a0 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  age1 */.  assert
368b0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
368c0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
368d0 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 7d 0a  pPCache)>0 );.}.
368e0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
368f0 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
36900 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg){.  if( pPg )
36910 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36920 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
36930 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
36940 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
36950 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
36960 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
36970 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
36980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
36990 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 61  ->pgno==1 );.  a
369a0 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
369b0 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 29  gs & PGHDR_MMAP)
369c0 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65 31 20  ==0 ); /* Page1 
369d0 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
369e0 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50 61 67  mapped */.  pPag
369f0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
36a00 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
36a10 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
36a20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
36a30 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
36a40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
36a50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
36a60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
36a70 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
36a80 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
36a90 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
36aa0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
36ab0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
36ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
36ad0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
36ae0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
36af0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
36b00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
36b10 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
36b20 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
36b30 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
36b40 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
36b50 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
36b60 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
36b70 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
36b80 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
36b90 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36ba0 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
36bb0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
36bc0 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
36bd0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
36be0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
36bf0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
36c00 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
36c10 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
36c20 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
36c30 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
36c40 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
36c50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36c60 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
36c70 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
36c80 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
36c90 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
36ca0 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
36cb0 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
36cc0 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
36cd0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
36ce0 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
36cf0 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
36d00 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
36d10 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
36d20 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
36d30 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
36d40 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
36d50 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
36d60 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
36d70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
36d80 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
36d90 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
36da0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
36db0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
36dc0 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
36dd0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
36de0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
36df0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
36e00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
36e10 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
36e20 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
36e30 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
36e40 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
36e50 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
36e60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
36e70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36e90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
36ea0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
36eb0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
36ec0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
36ed0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
36ee0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
36ef0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
36f00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36f10 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
36f20 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
36f30 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36f40 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36f60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
36f70 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
36f80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
36f90 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
36fa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
36fb0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
36fc0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
36fd0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
36fe0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
36ff0 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
37000 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
37010 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
37020 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
37030 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
37040 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
37050 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
37060 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
37070 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
37080 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
37090 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
370a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
370b0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
370c0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
370d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
370e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
370f0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
37100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
37110 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
37120 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
37130 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
37140 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
37150 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
37160 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
37170 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
37180 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
37190 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
371a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
371b0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
371c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
371d0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
371e0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
371f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37200 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c   int flags = SQL
37210 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
37220 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
37230 52 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69  REATE;.        i
37240 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20  nt nSpill;..    
37250 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37260 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
37270 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
37280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
37290 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
372a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
372b0 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  AL);.          n
372c0 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43  Spill = sqlite3C
372d0 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c  onfig.nStmtSpill
372e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
372f0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
37300 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
37310 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
37320 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
37330 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
37340 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
37350 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20   }.          .  
37360 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
37370 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
37380 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20  e still has the 
37390 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20  same name as it 
373a0 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20  did when.       
373b0 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69   ** it was origi
373c0 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  nally opened. */
373d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61  .        rc = da
373e0 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
373f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
37400 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37420 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
37430 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20  nalOpen (.      
37440 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
37450 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
37460 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
37470 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20  gs, nSpill.     
37480 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
37490 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
374a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
374b0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
374c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
374d0 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20      }.  .  .    
374e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72  /* Write the fir
374f0 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
37500 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r to the journal
37510 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a   file and open .
37520 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
37530 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
37540 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ary..    */.    
37550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37560 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  K ){.      /* TO
37570 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
37580 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
37590 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
375a0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
375b0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
375c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
375d0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
375e0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
375f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
37600 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
37610 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  0;.      rc = wr
37620 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
37630 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
37640 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
37650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
37660 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
37670 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
37680 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
37690 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
376a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
376b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
376c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
376d0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
376e0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
376f0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
37700 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a  _CACHEMOD;.  }..
37710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37720 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
37730 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
37740 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
37750 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
37760 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
37770 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
37780 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
37790 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
377a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
377b0 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
377c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
377d0 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
377e0 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
377f0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
37800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37810 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
37820 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
37830 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
37840 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
37850 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
37860 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
37870 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
37880 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
37890 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
378a0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
378b0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
378c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
378d0 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
378e0 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
378f0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
37900 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
37910 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
37920 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
37930 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
37940 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
37950 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
37960 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
37970 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
37980 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
37990 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
379a0 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
379b0 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
379c0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
379d0 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
379e0 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
379f0 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
37a00 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
37a10 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
37a20 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
37a30 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
37a40 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
37a50 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
37a60 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
37a70 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
37a80 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
37a90 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
37aa0 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
37ab0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
37ac0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
37ad0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
37ae0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ger->errCode ) r
37af0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
37b00 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  rCode;.  assert(
37b10 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
37b20 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
37b30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
37b40 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
37b50 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
37b60 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
37b70 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28  InMemory;..  if(
37b80 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
37b90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
37ba0 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73  ADER) ){.    ass
37bb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
37bc0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20  Journal==0 );.. 
37bd0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
37be0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
37bf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
37c00 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  ger is configure
37c10 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67  d to use locking
37c20 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c  _mode=exclusive,
37c30 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a   and an.      **
37c40 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
37c50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
37c60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
37c70 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e  eld, obtain it n
37c80 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ow..      */.   
37c90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
37ca0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
37cb0 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
37cc0 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
37cd0 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  pWal, -1) ){.   
37ce0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
37cf0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58  ockDb(pPager, EX
37d00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
37d10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37d40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37d50 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
37d60 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
37d70 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
37d80 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
37d90 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
37da0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
37db0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
37dc0 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
37dd0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
37de0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
37df0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
37e00 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
37e10 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
37e20 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
37e30 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
37e40 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
37e50 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
37e60 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
37e70 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
37e80 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
37e90 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
37ea0 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
37eb0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
37ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
37ed0 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
37ee0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
37ef0 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
37f00 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
37f10 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
37f20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
37f30 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
37f40 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
37f50 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
37f60 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
37f70 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
37f80 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
37f90 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
37fa0 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
37fb0 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
37fc0 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
37fd0 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
37fe0 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
37ff0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
38000 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
38010 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
38020 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
38030 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
38040 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
38050 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
38060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
38070 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
38080 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
38090 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
380a0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
380b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
380c0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
380d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
380e0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
380f0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
38100 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
38110 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
38120 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
38130 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
38140 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
38150 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
38160 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
38170 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
38180 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
38190 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
381a0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
381b0 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
381c0 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
381d0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
381e0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
381f0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
38200 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
38210 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
38220 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
38230 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
38240 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
38250 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
38260 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
38270 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
38280 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
38290 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
382a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
382b0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
382c0 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
382d0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
382e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
382f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
38300 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
38310 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
38320 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
38330 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
38340 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
38350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
38360 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
38370 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
38380 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
38390 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
383a0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
383b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
383c0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
383d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
383e0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
383f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
38400 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
38410 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
38420 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
38430 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
38440 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
38450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38460 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67  ./*.** Write pag
38470 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65  e pPg onto the e
38480 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  nd of the rollba
38490 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  ck journal..*/.s
384a0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
384b0 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41  NLINE int pagerA
384c0 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b  ddPageToRollback
384d0 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
384e0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
384f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
38500 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  er;.  int rc;.  
38510 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61  u32 cksum;.  cha
38520 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34  r *pData2;.  i64
38530 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
38540 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
38550 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
38560 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
38570 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
38580 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63  page that.  ** c
38590 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
385a0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
385b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
385c0 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20  t verifies.  ** 
385d0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
385e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
385f0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
38600 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
38610 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
38620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
38630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
38640 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70  ff );.  CODEC2(p
38650 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
38660 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
38670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
38680 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61  OMEM_BKPT, pData
38690 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61  2);.  cksum = pa
386a0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
386b0 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
386c0 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e  .  /* Even if an
386d0 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
386e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
386f0 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalli