/ Hex Artifact Content
Login

Artifact 78b65bf9685bf21b787ce2a7389c2b96102942dc:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70  */..  void *pMap
7c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c80: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
7c90: 65 64 20 70 72 65 66 69 78 20 6f 66 20 64 61 74  ed prefix of dat
7ca0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7cb0: 69 36 34 20 6e 4d 61 70 3b 20 20 20 20 20 20 20  i64 nMap;       
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cd0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
7ce0: 74 20 70 4d 61 70 20 69 6e 20 62 79 74 65 73 20  t pMap in bytes 
7cf0: 2a 2f 20 0a 20 20 69 36 34 20 6e 4d 61 70 56 61  */ .  i64 nMapVa
7d00: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
7d10: 20 20 2f 2a 20 42 79 74 65 73 20 61 74 20 70 4d    /* Bytes at pM
7d20: 61 70 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  ap known to be v
7d30: 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  alid */.  i64 nM
7d40: 61 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  apLimit;        
7d50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
7d60: 20 70 65 72 6d 69 74 74 65 64 20 6d 61 70 70 69   permitted mappi
7d70: 6e 67 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  ng size */.  int
7d80: 20 6e 4d 61 70 43 66 67 4c 69 6d 69 74 3b 20 20   nMapCfgLimit;  
7d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
7da0: 69 67 75 72 65 64 20 6c 69 6d 69 74 20 76 61 6c  igured limit val
7db0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61  ue */.  int nMma
7dc0: 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  pOut;           
7dd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7de0: 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75 72 72   mmap pages curr
7df0: 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e  ently outstandin
7e00: 67 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  g */.  PgHdr *pF
7e10: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
7e20: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7e30: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7e40: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7e50: 0a 20 20 69 6e 74 20 62 4d 61 70 52 65 73 69 7a  .  int bMapResiz
7e60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
7e70: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 6d  * Check if the m
7e80: 61 70 70 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  apping should be
7e90: 20 72 65 73 69 7a 65 64 20 2a 2f 0a 20 20 2f 2a   resized */.  /*
7ea0: 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  .  ** End of the
7eb0: 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67   routinely-chang
7ec0: 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ing class member
7ed0: 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.  ************
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
7f20: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
7f50: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
7f60: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
7f70: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
7fa0: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
7fb0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
7fc0: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fe0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
7ff0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
8000: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
8010: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
8020: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
8030: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
8040: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
8050: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
8060: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8070: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
8080: 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  page */.  Pgno m
8090: 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  xPgno;          
80a0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
80b0: 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66   allowed size of
80c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
80d0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
80e0: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
80f0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
8100: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
8110: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63  nal files */.  c
8120: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8140: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8150: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
8160: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
8170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8180: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8190: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
81a0: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
81b0: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
81c0: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
81d0: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
81e0: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
81f0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
8200: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
8210: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  syHandler */.  i
8220: 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20  nt aStat[3];    
8230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8240: 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20  tal cache hits, 
8250: 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69 74 65  misses and write
8260: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
8270: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52  TE_TEST.  int nR
8280: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
8290: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
82a0: 65 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a  e pages read */.
82b0: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
82c0: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
82d0: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
82e0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
82f0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
8300: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8310: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
8320: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
8330: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8340: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8350: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8360: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8370: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8380: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8390: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
83a0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
83b0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
83c0: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
83d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
83e0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
83f0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
8400: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
8410: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8420: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
8430: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8440: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8450: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8460: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8470: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8480: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8490: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
84a0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
84b0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
84c0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
84d0: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
84e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
84f0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8510: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
8520: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
8530: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8540: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8560: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8570: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8580: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8590: 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65   Indexes for use
85a0: 20 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61   with Pager.aSta
85b0: 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61  t[]. The Pager.a
85c0: 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Stat[] array con
85d0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
85e0: 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20  ues accessed by 
85f0: 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44  passing SQLITE_D
8600: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49  BSTATUS_CACHE_HI
8610: 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a  T, CACHE_MISS .*
8620: 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45  * or CACHE_WRITE
8630: 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73   to sqlite3_db_s
8640: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66  tatus()..*/.#def
8650: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48  ine PAGER_STAT_H
8660: 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50  IT   0.#define P
8670: 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20  AGER_STAT_MISS  
8680: 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  1.#define PAGER_
8690: 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a  STAT_WRITE 2../*
86a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
86b0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
86c0: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
86d0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
86e0: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
86f0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
8700: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
8710: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
8720: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
8730: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
8740: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
8750: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
8760: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
8770: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
8780: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
8790: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
87a0: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
87b0: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
87c0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
87d0: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
87e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
87f0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8800: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
8810: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
8820: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8830: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
8840: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
8850: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
8860: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
8870: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
8880: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
8890: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
88a0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
88b0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
88c0: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
88d0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
88e0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
88f0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
8900: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
8910: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
8920: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
8930: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
8940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
8950: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
8960: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
8970: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
8980: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
8990: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
89a0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
89b0: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
89c0: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
89d0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
89e0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
89f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
8a00: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
8a10: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
8a20: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
8a30: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
8a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
8a50: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
8a60: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
8a70: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
8a80: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
8a90: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
8aa0: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
8ab0: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
8ac0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
8ad0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
8ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
8af0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
8b00: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
8b10: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
8b20: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
8b30: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
8b40: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
8b50: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
8b60: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
8b70: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
8b80: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
8b90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
8ba0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
8bb0: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
8bc0: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
8bd0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
8be0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
8bf0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
8c00: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8c10: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
8c20: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
8c30: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
8c40: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
8c50: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
8c60: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
8c70: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
8c80: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
8c90: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
8ca0: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
8cb0: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
8cc0: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
8cd0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
8ce0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
8cf0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
8d00: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
8d10: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
8d20: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
8d30: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
8d40: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
8d50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
8d60: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
8d70: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
8d80: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
8d90: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
8da0: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
8db0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
8dc0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
8dd0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
8de0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
8df0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
8e00: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
8e10: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
8e20: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
8e30: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
8e40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
8e50: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
8e60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
8e70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
8e80: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
8e90: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
8ea0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
8eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
8ec0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
8ed0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
8ee0: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
8ef0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
8f00: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
8f10: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
8f20: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
8f30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
8f40: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
8f50: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
8f60: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
8f70: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
8f80: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
8f90: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
8fa0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8fb0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
8fc0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
8fd0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
8fe0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
8ff0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
9000: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
9010: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
9020: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
9030: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
9040: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
9050: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
9060: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
9070: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
9080: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
9090: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
90a0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
90b0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
90c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
90d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
90e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
90f0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
9100: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
9110: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
9120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
9130: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63  ment to this mac
9140: 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73  ro is a file des
9150: 63 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71  criptor (type sq
9160: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a  lite3_file*)..**
9170: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9180: 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
9190: 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f  non-zero (but no
91a0: 74 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a  t 1) if it is..*
91b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20  *.** This is so 
91c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
91d0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
91e0: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  as:.**.**   if( 
91f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9200: 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  fd) ){ ....**.**
9210: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a   instead of.**.*
9220: 2a 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  *   if( pPager->
9230: 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  jfd->pMethods ){
9240: 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   ....*/.#define 
9250: 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46  isOpen(pFd) ((pF
9260: 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f  d)->pMethods)../
9270: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
9280: 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75   if this pager u
9290: 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61  ses a write-ahea
92a0: 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66  d log instead of
92b0: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f   the usual.** ro
92c0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
92d0: 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  Otherwise false.
92e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
92f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74  TE_OMIT_WAL.stat
9300: 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57  ic int pagerUseW
9310: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
9320: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  ){.  return (pPa
9330: 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d  ger->pWal!=0);.}
9340: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9350: 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30  pagerUseWal(x) 0
9360: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
9370: 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a  ollbackWal(x) 0.
9380: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61  # define pagerWa
9390: 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29  lFrames(v,w,x,y)
93a0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
93b0: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
93c0: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
93d0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
93e0: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
93f0: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9400: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9410: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9420: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9430: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
9440: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
9450: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
9460: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
9470: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
9480: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
9490: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
94a0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
94b0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
94c0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
94d0: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
94e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
94f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9500: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9510: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9520: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9530: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
9540: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
9550: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
9560: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
9570: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9580: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
9590: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
95a0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
95b0: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
95c0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
95d0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
95e0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
95f0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9600: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9610: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9620: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9630: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
9640: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
9650: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
9660: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
9670: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
9680: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
9690: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
96a0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
96b0: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
96c0: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
96d0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
96e0: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
96f0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9700: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9710: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9720: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9730: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
9740: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
9750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
9760: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
9770: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
9780: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
9790: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
97a0: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
97d0: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
97e0: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
97f0: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9800: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9810: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9820: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9830: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9840: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9850: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
9860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9870: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
9880: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9890: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
98a0: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
98b0: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
98c0: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
98d0: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
98e0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
98f0: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9900: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9910: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9920: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9930: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
9940: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
9950: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
9960: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
9970: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
9980: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
9990: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
99a0: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
99b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
99c0: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
99d0: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
99e0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
99f0: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9a00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9a10: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9a20: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9a30: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
9a40: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
9a50: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
9a60: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
9a70: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
9a80: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
9a90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9aa0: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9ab0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ac0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9ad0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9ae0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9af0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9b00: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9b10: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9b20: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9b30: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
9b40: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
9b50: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
9b60: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
9b70: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
9b80: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
9b90: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9ba0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9bb0: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9bc0: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9bd0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9be0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9bf0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9c10: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9c30: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
9c40: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
9c50: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
9c60: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
9c70: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
9c80: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
9c90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9ca0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9cb0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9cc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9cd0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9ce0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9cf0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9d00: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9d10: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9d20: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9d30: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9d40: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9d50: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9d60: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9d70: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9d90: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9da0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  OCK );.      bre
9db0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9dc0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9dd0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9de0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9df0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9e00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9e10: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9e20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9e30: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9e40: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9e50: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9e60: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9e70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e90: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9ea0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9eb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ec0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9ed0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ee0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9ef0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9f00: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9f10: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9f30: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9f40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9f50: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f60: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9f70: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9f80: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9f90: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9fa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9fb0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9fc0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9fd0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9fe0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ff0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
a000: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
a010: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
a020: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
a030: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
a040: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
a050: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
a060: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
a070: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
a080: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
a090: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
a0a0: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
a0b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
a0c0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
a0d0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
a0e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a0f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->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 20 20 20 20 20 20 61 73  CK );.        as
a120: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a130: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a140: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a150: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a160: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a170: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a180: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a190: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a1a0: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
a1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a1c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a1d0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a1e0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
a1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a200: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a210: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
a220: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
a230: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a240: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
a250: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a260: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a270: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a280: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a290: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a2a0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a2b0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a2c0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a2d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a2e0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
a2f0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a300: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a310: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a320: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a330: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a340: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a350: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a360: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a370: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a380: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a390: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a3a0: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a3b0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a3c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3d0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3e0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a3f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a400: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a410: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a420: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a430: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a440: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a450: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a460: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a470: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a480: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a490: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a4a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a4b0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a4c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a4d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a4e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a4f0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a500: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a510: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a520: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a530: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a540: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a550: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a560: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a570: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a580: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a590: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a5a0: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a5b0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a5c0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a5d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a5e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a5f0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a600: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a610: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a620: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a630: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a650: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a660: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a670: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a680: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a6a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a6b0: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a6c0: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a6d0: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a6e0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a6f0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a700: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a710: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a720: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a730: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a740: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a750: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a760: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a770: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a780: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a790: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a7a0: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a7b0: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a7c0: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a7d0: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a7e0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a7f0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a800: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a810: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a820: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a830: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a840: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a850: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a860: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a870: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a880: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a890: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a8a0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a8b0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a8c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a8d0: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a8e0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a8f0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a900: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a910: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a920: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a930: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a940: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a950: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a960: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a970: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a980: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a990: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a9a0: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a9b0: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a9c0: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a9d0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a9e0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a9f0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
aa00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa10: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa20: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
aa30: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
aa40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
aa50: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
aa60: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
aa70: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
aa90: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
aaa0: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
aab0: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
aac0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
aad0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
aae0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
aaf0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
ab00: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
ab10: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
ab20: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
ab30: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ab40: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
ab50: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
ab60: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
ab70: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
ab80: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
ab90: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
aba0: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
abb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
abc0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
abd0: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
abe0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
abf0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
ac00: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
ac10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac20: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
ac30: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
ac40: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
ac50: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
ac60: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
ac70: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
ac80: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
ac90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aca0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
acb0: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
acc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
acd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ace0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
acf0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
ad00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
ad10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ad20: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
ad30: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
ad40: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
ad50: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ad60: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
ad70: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
ad80: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
ad90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ada0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
adb0: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
adc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
add0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ade0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
adf0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
ae00: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
ae10: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
ae20: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
ae30: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ae40: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ae50: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ae60: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ae70: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ae80: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ae90: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
aea0: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
aeb0: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
aec0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
aed0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aee0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
aef0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
af00: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
af10: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
af20: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
af30: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
af40: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
af50: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
af60: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
af70: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
af80: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
af90: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
afa0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
afb0: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
afc0: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
afd0: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
afe0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
aff0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b000: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b010: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b020: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b040: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b050: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
b060: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
b070: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
b080: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
b090: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
b0a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
b0b0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
b0c0: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
b0d0: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
b0e0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
b0f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
b100: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
b110: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
b120: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
b130: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
b140: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b150: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b160: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
b170: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
b180: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
b190: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
b1a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
b1b0: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
b1c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b1d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b1e0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
b1f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
b200: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
b210: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
b220: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
b230: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b240: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
b250: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
b260: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
b270: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
b280: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
b290: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
b2a0: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
b2b0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b2c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
b2d0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
b2e0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
b2f0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
b300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
b310: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
b320: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b330: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b340: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b350: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b360: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b370: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b380: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b390: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b3a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b3b0: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b3c0: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b3d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b3e0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b3f0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b400: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b410: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b420: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b430: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b440: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b450: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b460: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b470: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b480: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b490: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b4a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b4b0: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b4c0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b4d0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b4e0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b4f0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b500: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b510: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b520: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b530: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b540: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b550: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b560: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b570: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b580: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b590: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b5a0: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b5b0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b5c0: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b5d0: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b5e0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b5f0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b600: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b610: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b620: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b630: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b640: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b650: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b660: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b670: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b680: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b690: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b6a0: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b6b0: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b6c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b6d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b6e0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b6f0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b700: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b710: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b720: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b730: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b740: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b750: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b760: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b770: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b780: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b790: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b7a0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b7b0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b7c0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b7d0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b7e0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b7f0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b800: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b810: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b820: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b830: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b840: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b850: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b860: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b870: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b880: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b890: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b8a0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b8b0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b8c0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b8d0: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b8e0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b8f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b910: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b920: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b930: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b940: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b950: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b960: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b970: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b980: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b990: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b9a0: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b9b0: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b9c0: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b9d0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b9e0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b9f0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
ba00: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
ba10: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
ba20: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
ba30: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
ba40: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
ba50: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
ba60: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
ba70: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
ba80: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
ba90: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
baa0: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bab0: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bac0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bad0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bae0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
baf0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bb00: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bb10: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bb20: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bb30: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bb40: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bb50: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bb60: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bb70: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bb80: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
bb90: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
bba0: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
bbb0: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
bbc0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bbd0: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
bbe0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bbf0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
bc00: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
bc10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
bc20: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
bc30: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
bc40: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
bc50: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bc60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bc70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bc80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
bc90: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
bca0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
bcb0: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
bcc0: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
bcd0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
bce0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
bcf0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
bd00: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
bd10: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
bd20: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
bd30: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
bd40: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
bd50: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
bd60: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
bd70: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
bd80: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
bd90: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bda0: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
bdb0: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
bdc0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
bdd0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
bde0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bdf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
be00: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
be10: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
be20: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
be30: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
be40: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
be50: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
be60: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
be70: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
be80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
be90: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bea0: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
beb0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bec0: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bed0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bee0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bef0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bf00: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bf10: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bf20: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bf30: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bf40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bf50: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bf60: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bf70: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bf80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bf90: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bfa0: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bfb0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bfc0: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bff0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
c000: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
c010: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c020: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
c030: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
c040: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
c070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
c080: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c090: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
c0a0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
c0b0: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
c0c0: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
c0d0: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
c0e0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
c0f0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
c100: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
c110: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
c120: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
c130: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
c140: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c150: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
c160: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
c170: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
c180: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
c190: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
c1a0: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
c1b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c1c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c1d0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
c1e0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
c1f0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c200: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
c210: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
c220: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
c230: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
c240: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
c250: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
c260: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
c270: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
c280: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
c290: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
c2a0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
c2b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c2c0: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
c2d0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
c2e0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
c2f0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
c300: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
c310: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
c320: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
c330: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c340: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c350: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c360: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c370: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c380: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c390: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c3a0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c3b0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c3c0: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c3d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c3e0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c3f0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c400: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c410: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c420: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c430: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c440: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c450: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c460: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c470: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c480: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c490: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c4a0: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c4b0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c4c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c4d0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c4e0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c4f0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c500: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c510: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c520: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c530: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c540: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c550: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c560: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c570: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c580: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c590: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c5a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c5b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c5c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c5d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c5e0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c5f0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c600: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c610: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c620: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c630: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c640: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c650: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c660: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c670: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c680: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c690: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c6a0: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c6b0: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c6c0: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c6d0: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c6e0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c6f0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c700: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c710: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c720: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c730: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c740: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c750: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c760: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c770: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c780: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c790: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c7a0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c7b0: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c7c0: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c7d0: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c7e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c7f0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c800: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c810: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c820: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c830: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c840: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c850: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c860: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c870: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c880: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c890: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c8a0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c8b0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c8c0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c8d0: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c8e0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c8f0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c900: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c910: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c920: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c930: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c940: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c950: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c960: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c970: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c980: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c990: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c9a0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c9b0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c9c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c9d0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c9f0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
ca00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ca10: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
ca20: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
ca30: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
ca40: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
ca50: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
ca60: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
ca70: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
ca80: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
ca90: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
caa0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
cab0: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
cac0: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
cad0: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
cae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
caf0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
cb00: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
cb10: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
cb20: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
cb30: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
cb40: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
cb50: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
cb60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
cb70: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
cb80: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
cb90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
cba0: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
cbb0: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
cbc0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
cbd0: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
cbe0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
cc10: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
cc40: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
cc50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
cc60: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cc80: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
cc90: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
cca0: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
ccb0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
ccc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
ccd0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
cce0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
ccf0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
cd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
cd30: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
cd40: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
cd50: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
cd60: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
cd70: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
cd80: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
cd90: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cda0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
cdb0: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
cdc0: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
cdd0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
cde0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cdf0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
ce00: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
ce10: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
ce20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
ce30: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
ce40: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
ce50: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
ce60: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
ce70: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
ce80: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
ce90: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cea0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
ceb0: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cec0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ced0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cee0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cef0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cf00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cf10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cf20: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cf30: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cf40: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cf50: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cf60: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cf70: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cf80: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cf90: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cfa0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cfb0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cfc0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cfd0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cfe0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
cff0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
d000: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d010: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
d020: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
d030: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
d040: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
d050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
d060: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
d070: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
d080: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
d090: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
d0a0: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
d0b0: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
d0c0: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
d0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d0e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
d0f0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
d100: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
d110: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
d120: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d130: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
d140: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
d150: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
d160: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
d170: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
d180: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
d190: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
d1a0: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
d1b0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d1c0: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
d1d0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
d1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d200: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
d250: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d260: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d270: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
d280: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
d290: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
d2a0: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
d2b0: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
d2c0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
d2d0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
d2e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d2f0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
d300: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
d310: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
d320: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d350: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d360: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d370: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d380: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d390: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d3a0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d3b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d3c0: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d3e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d3f0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d400: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d410: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d420: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d430: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d440: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d450: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d460: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d470: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d480: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d490: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d4a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d4b0: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d4c0: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d4d0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d4e0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d4f0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d500: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d510: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d520: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d530: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d540: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d550: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d560: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d570: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d580: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d590: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d5a0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d5b0: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d5c0: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d5d0: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d5e0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d5f0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d600: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d610: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d620: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d630: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d640: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d650: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d660: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d670: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d680: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d690: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d6a0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d6b0: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d6c0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d6d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d6e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d6f0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d700: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d710: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d720: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d730: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d740: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d750: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d760: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d770: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d780: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d790: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d7a0: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d7b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d7c0: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d7d0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d7e0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d7f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d800: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d830: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d840: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d850: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d870: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d880: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d890: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d8a0: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d8b0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d8c0: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d8d0: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d8e0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d8f0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d900: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d910: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d920: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d930: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d950: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d960: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d970: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d980: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d990: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d9a0: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d9b0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d9c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d9d0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d9e0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d9f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
da00: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
da10: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
da20: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
da30: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
da40: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
da50: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
da60: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
da70: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
da80: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
da90: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
daa0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
dab0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
dac0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
dad0: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
dae0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
daf0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
db00: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
db10: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
db20: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
db30: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
db40: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
db50: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
db60: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
db70: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
db80: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
db90: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
dba0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dbb0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
dbc0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
dbd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dbe0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
dbf0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
dc00: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
dc10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
dc20: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
dc30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dc40: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
dc50: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
dc60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
dc70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
dc80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
dc90: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
dca0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
dcb0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
dcc0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
dcd0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
dce0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
dcf0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
dd00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
dd10: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
dd20: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
dd30: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
dd40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
dd50: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
dd60: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
dd70: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
dd80: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
dd90: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
dda0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
ddb0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
ddc0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
ddd0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
dde0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
ddf0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
de00: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
de10: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
de20: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
de30: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
de40: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
de50: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
de60: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
de70: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
de80: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
de90: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
dea0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
deb0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
dec0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
ded0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dee0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
def0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
df00: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
df10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df30: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
df40: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
df50: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
df60: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
df70: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
df80: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
df90: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dfa0: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dfb0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dfc0: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dfd0: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dfe0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e010: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
e020: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
e030: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e060: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
e070: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e080: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
e090: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
e0a0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
e0b0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
e0c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e0d0: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
e0e0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
e0f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
e100: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
e110: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
e120: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
e130: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
e140: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
e150: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
e160: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
e170: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
e180: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
e190: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
e1a0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
e1b0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
e1c0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
e1d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
e1e0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
e1f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
e200: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
e210: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
e220: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
e230: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
e240: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
e250: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
e260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
e270: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e280: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
e290: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
e2a0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
e2b0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
e2c0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
e2d0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
e2e0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
e2f0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
e300: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
e310: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
e320: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
e330: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e340: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e350: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e360: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e370: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e380: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e390: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e3a0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e3b0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e3c0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e3d0: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e3e0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e3f0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e400: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e410: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e420: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e430: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e440: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e450: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e460: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e470: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e480: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e490: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e4a0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e4b0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e4c0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e4d0: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e4e0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e4f0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e500: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e510: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e520: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e530: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e540: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e550: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e560: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e570: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e580: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e590: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e5a0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e5b0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e5c0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e5d0: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e5e0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e5f0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e600: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e610: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e620: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e630: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e640: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e650: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e660: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e670: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e680: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e690: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e6a0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e6b0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e6c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e6d0: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e6e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e6f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e700: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e710: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e720: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e730: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e740: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e750: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e760: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e770: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e780: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e790: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e7a0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e7b0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e7c0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e7e0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e7f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e800: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e810: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e820: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e830: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e840: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e850: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e860: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e870: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e880: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e890: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e8a0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e8b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e8c0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e8d0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e8e0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e8f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e900: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e910: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e920: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e930: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e940: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e950: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e960: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e970: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e980: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e990: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e9a0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e9b0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e9c0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e9d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e9e0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e9f0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
ea00: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
ea10: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
ea20: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
ea30: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
ea40: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
ea50: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ea60: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
ea70: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
ea80: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
ea90: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
eaa0: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
eab0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
eac0: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
ead0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
eae0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
eaf0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
eb00: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eb10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
eb20: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
eb30: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
eb40: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
eb50: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
eb60: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
eb70: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
eb80: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
eb90: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
eba0: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
ebb0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
ebc0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
ebd0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
ebe0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
ebf0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
ec00: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
ec10: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
ec20: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
ec30: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
ec40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
ec50: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
ec60: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
ec70: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
ec80: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
ec90: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
eca0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
ecb0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
ecc0: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
ecd0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
ece0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
ecf0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
ed00: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
ed10: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
ed20: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed30: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ed40: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ed50: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ed60: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ed70: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ed80: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ed90: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
eda0: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
edb0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
edc0: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
edd0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
ede0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
edf0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
ee00: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ee10: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
ee20: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
ee30: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
ee40: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
ee50: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
ee60: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
ee70: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
ee80: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
ee90: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eea0: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eeb0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eec0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eed0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eee0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
eef0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ef00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ef10: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ef20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ef30: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ef40: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ef50: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ef60: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ef70: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ef80: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ef90: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
efa0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
efb0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
efc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
efd0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
efe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eff0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
f000: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
f010: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f020: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
f030: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
f040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
f050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
f060: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
f070: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
f080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f090: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
f0a0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
f0b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
f0e0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
f0f0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
f100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f110: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
f120: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f130: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
f140: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
f150: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
f160: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
f170: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
f180: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
f190: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
f1a0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
f1b0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
f1c0: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
f1d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
f1e0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
f1f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
f200: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
f210: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
f220: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
f230: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
f240: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
f250: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
f260: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
f270: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
f280: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
f290: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
f2a0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
f2b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
f2c0: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
f2d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
f2e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f2f0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
f300: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
f310: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
f320: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
f330: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f340: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f350: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f360: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f370: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f380: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f390: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f3a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f3b0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f3c0: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f3d0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f3e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f3f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f400: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f410: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f420: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f430: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f440: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f450: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f470: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f490: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f4a0: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f4c0: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f4d0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f4e0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f4f0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f510: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f520: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f530: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f540: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f550: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f560: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f570: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f580: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f590: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f5a0: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f5b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f5c0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f5d0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f5e0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f5f0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f600: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f610: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f620: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f630: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f640: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f650: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f660: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f670: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f680: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f690: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f6a0: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f6b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f6c0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f6d0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f6e0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f6f0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f700: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f710: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f720: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f730: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f740: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f750: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f760: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f770: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f780: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f790: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f7a0: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f7b0: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f7c0: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f7d0: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f7e0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f7f0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f800: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f810: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f820: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f830: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f840: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f850: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f860: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f870: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f880: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f890: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f8a0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f8b0: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f8c0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f8d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f8e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f8f0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f900: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f910: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f920: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f930: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f950: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f960: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f980: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f990: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f9a0: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f9b0: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f9c0: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f9d0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f9e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f9f0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fa00: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
fa10: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
fa20: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
fa30: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fa40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fa50: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
fa60: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
fa70: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fa80: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
fa90: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
faa0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
fab0: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
fac0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fad0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
fae0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
faf0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
fb00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
fb10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
fb20: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
fb30: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
fb40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fb50: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
fb60: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
fb70: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
fb80: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
fb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
fba0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
fbb0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fbc0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
fbd0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
fbe0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
fbf0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
fc00: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
fc10: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
fc20: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
fc30: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
fc40: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
fc50: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
fc60: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fc70: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
fc80: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
fc90: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
fca0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
fcb0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
fcc0: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
fcd0: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
fce0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
fcf0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fd00: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
fd10: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
fd20: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
fd30: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fd40: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fd50: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fd60: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fd70: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fd80: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fd90: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fda0: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fdb0: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fdc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fdd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
fde0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fdf0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fe00: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fe10: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fe20: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
fe30: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fe40: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fe50: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fe60: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fe70: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fe80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fe90: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fea0: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
feb0: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fec0: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fed0: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fee0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fef0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
ff00: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
ff10: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
ff20: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
ff30: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
ff40: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
ff50: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
ff60: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
ff70: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
ff80: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
ff90: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
ffa0: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
ffb0: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
ffc0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ffd0: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
ffe0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fff0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10000 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10010 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10020 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10030 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10040 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10050 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10060 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
10070 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
10080 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
10090 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
100a0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
100b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
100c0 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
100d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
100e0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
100f0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10100 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10110 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10120 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10130 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10140 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10150 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10160 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
10170 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
10180 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
10190 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
101a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
101b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
101c0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
101d0 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
101e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
101f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10200 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
10210 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
10220 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
10230 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
10240 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
10250 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
10260 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
10270 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
10280 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
10290 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
102a0 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
102b0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
102c0 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
102d0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
102e0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
102f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
10300 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
10310 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
10320 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
10330 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10340 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10360 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10370 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10380 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10390 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
103a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
103b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
103c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
103d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
103e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
103f0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10400 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
10410 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
10420 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
10430 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10440 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10450 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10460 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10470 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10480 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10490 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
104a0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
104b0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
104c0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
104d0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
104e0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
104f0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
10500 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
10510 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
10520 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
10530 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10540 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10550 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10560 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10570 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10580 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10590 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
105a0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
105b0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
105c0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
105d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
105e0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
105f0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
10600 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
10610 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
10620 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
10630 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10640 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10650 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10660 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10670 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10680 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10690 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
106a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
106b0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
106c0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
106d0 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
106e0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
106f0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
10700 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10710 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
10720 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
10730 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10740 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10750 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10770 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10780 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10790 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
107a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
107b0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
107c0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
107d0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
107f0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
10800 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
10810 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
10820 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10830 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10840 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10850 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10860 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10880 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10890 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
108a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
108b0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
108c0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
108d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
108e0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
108f0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
10900 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10910 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10920 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
10930 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10940 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10950 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10970 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10980 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10990 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
109a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
109b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
109c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
109d0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
109e0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
109f0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
10a00 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
10a10 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
10a20 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
10a30 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10a40 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10a50 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10a60 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10a70 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10a80 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10a90 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10aa0 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10ab0 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10ac0 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10ad0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10ae0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
10af0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
10b00 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
10b10 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
10b20 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
10b30 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10b40 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10b50 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10b60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10b70 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10b80 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10b90 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10ba0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10bb0 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10bc0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10bd0 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
10be0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
10bf0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
10c00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10c10 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
10c20 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
10c30 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10c40 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10c50 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10c60 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10c70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10c80 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10c90 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10ca0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10cb0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10cc0 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10cd0 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
10ce0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10cf0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10d00 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10d10 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
10d20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10d30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10d40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10d50 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10d60 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10d70 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10d80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10d90 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10da0 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10db0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10dc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10dd0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10de0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10df0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10e00 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10e10 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10e20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10e30 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10e40 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10e50 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10e60 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10e70 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10e80 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10e90 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10ea0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10eb0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10ec0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10ed0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ee0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10ef0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10f00 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10f10 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10f20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10f30 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10f40 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10f50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10f60 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10f70 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10f80 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10f90 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10fa0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10fb0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10fc0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10fd0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10fe0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10ff0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11000 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11010 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11020 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11030 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11040 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11060 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11070 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11080 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
11090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
110a0 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
110b0 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
110c0 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
110d0 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
110e0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
110f0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
11100 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
11110 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
11120 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
11130 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
11140 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
11150 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
11160 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
11170 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
111a0 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
111b0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
111c0 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
111d0 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
111e0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
111f0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
11200 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
11210 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
11220 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
11230 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
11240 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
11250 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
11260 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
11270 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
11280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11290 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
112a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
112b0 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
112c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
112d0 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
112e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
112f0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
11300 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
11310 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
11320 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
11330 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11340 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11350 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11360 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11370 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11380 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11390 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
113a0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
113b0 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
113c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
113d0 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
113e0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
113f0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11400 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11410 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11420 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11430 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11440 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11450 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11460 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11470 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11480 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11490 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
114a0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
114b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
114c0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
114d0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
114e0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
114f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11500 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11510 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
11520 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
11530 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11540 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11550 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11560 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11570 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11580 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11590 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
115a0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
115b0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
115c0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
115d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
115e0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
115f0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
11600 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
11610 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
11620 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
11630 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11640 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11650 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11660 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11670 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11680 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11690 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
116a0 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
116b0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
116c0 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
116f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11700 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11710 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
11720 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
11730 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11740 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11750 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11760 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11770 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11780 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11790 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
117a0 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
117b0 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
117c0 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
117d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
117e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
117f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11810 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11820 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
11830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11840 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11850 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11860 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11870 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11880 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11890 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
118a0 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
118b0 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
118c0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
118d0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
118e0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
118f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
11900 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
11910 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
11920 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
11930 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11940 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11950 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11960 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11970 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11980 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11990 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
119a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
119b0 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
119c0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
119d0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
119e0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
119f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
11a00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
11a10 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
11a20 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
11a30 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11a40 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11a50 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11a60 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11a70 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11a80 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11a90 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11aa0 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11ac0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11ad0 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
11ae0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
11af0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
11b00 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
11b10 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
11b20 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11b30 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11b40 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11b50 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11b70 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11b80 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11b90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11ba0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11bb0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11bc0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11bd0 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
11be0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
11bf0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
11c00 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
11c10 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11c20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
11c30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11c40 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11c50 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11c60 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11c70 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11c80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11c90 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11ca0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11cb0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11cc0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11cd0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
11ce0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
11cf0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
11d00 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
11d10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11d20 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11d50 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11d60 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11d70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11d80 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11d90 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11da0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11db0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11dc0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11dd0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11de0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11df0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11e00 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11e10 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11e20 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11e30 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11e40 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11e50 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11e70 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11e80 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11e90 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11ea0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11eb0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11ec0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11ed0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ee0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11ef0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11f00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11f10 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11f20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11f30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11f40 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11f50 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f60 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f70 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11f80 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f90 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11fa0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11fb0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11fc0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11fd0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11fe0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11ff0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12000 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12010 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12020 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12030 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12040 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12050 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12060 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12070 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12080 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
12090 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
120a0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
120b0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
120c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
120d0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
120e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
120f0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12100 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12110 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12120 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12130 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12140 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12150 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12160 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12170 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12180 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12190 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
121a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
121b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
121c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
121d0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
121e0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
121f0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12210 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12220 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12230 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12240 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12250 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12260 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12270 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12280 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12290 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
122a0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
122b0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
122c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
122d0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
122e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
122f0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12300 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12310 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12320 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12330 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12340 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12350 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12360 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12370 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12380 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12390 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
123a0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
123b0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
123c0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
123d0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
123e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
123f0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12400 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12410 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12420 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12430 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12440 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12450 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12460 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12470 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12480 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12490 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
124a0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
124b0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
124c0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
124d0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
124e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
124f0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12500 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12520 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
12530 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12550 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12560 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12570 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12580 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12590 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
125a0 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
125b0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
125c0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
125d0 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
125e0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
125f0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
12600 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
12610 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
12620 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
12630 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12640 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12650 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12660 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12670 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12680 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12690 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
126a0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
126b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
126c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
126d0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
126e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
126f0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
12700 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
12710 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
12720 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
12730 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12740 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12750 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12760 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12770 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12780 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12790 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
127a0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
127b0 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
127c0 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
127d0 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
127e0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
127f0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
12800 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
12810 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
12820 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12830 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12840 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12850 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12860 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12870 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12880 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12890 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
128a0 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
128b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
128c0 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
128d0 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
128e0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
128f0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
12900 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
12910 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
12920 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
12930 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12950 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12960 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12970 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12980 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12990 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
129a0 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
129b0 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
129c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
129d0 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
129e0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
129f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12a00 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
12a10 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
12a20 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12a30 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12a40 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12a50 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12a60 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12a70 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12a80 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12a90 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12aa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12ab0 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12ac0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12ad0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
12ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
12af0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
12b00 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
12b10 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b  er, Pgno nPage);
12b20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12b30 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
12b40 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
12b50 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
12b60 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
12b70 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
12b80 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
12b90 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
12ba0 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
12bb0 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
12bc0 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
12bd0 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
12be0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12bf0 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
12c00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12c10 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
12c20 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
12c30 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
12c40 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
12c50 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ction..** .** Th
12c60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
12c70 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41  ver called in PA
12c80 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
12c90 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64   If it is called
12ca0 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e  .** in PAGER_NON
12cb0 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45  E or PAGER_SHARE
12cc0 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  D state and the 
12cd0 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73  lock held is les
12ce0 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74  s.** exclusive t
12cf0 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  han a RESERVED l
12d00 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  ock, it is a no-
12d10 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  op..**.** Otherw
12d20 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20  ise, any active 
12d30 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72  savepoints are r
12d40 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eleased..**.** I
12d50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12d60 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
12d70 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65   it is "finalize
12d80 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e  d". Once a journ
12d90 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20  al .** file has 
12da0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69  been finalized i
12db0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
12dc0 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72  e to use it to r
12dd0 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74  oll back a .** t
12de0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20  ransaction. Nor 
12df0 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69  will it be consi
12e00 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f  dered to be a ho
12e10 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69  t-journal by thi
12e20 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65  s.** or any othe
12e30 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
12e40 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68  ction. Exactly h
12e50 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ow a journal is 
12e60 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70  finalized.** dep
12e70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
12e80 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72  or not the pager
12e90 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
12ea0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12eb0 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  d.** the current
12ec0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50   journal-mode (P
12ed0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
12ee0 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c   value), as foll
12ef0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ows:.**.**   jou
12f00 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
12f10 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
12f20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12f30 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64  is simply closed
12f40 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20  . This destroys 
12f50 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65  an .**     in-me
12f60 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  mory journal..**
12f70 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12f80 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  e==TRUNCATE.**  
12f90 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
12fa0 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  is truncated to 
12fb0 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
12fc0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ze..**.**   jour
12fd0 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12fe0 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73  .**     The firs
12ff0 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68  t 28 bytes of th
13000 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
13010 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20  re zeroed. This 
13020 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20  invalidates.**  
13030 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75     the first jou
13040 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  rnal header in t
13050 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e  he file, and hen
13060 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  ce the entire jo
13070 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
13080 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f  e. An invalid jo
13090 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
130a0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
130b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
130c0 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a  lMode==DELETE.**
130d0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
130e0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20   file is closed 
130f0 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e  and deleted usin
13100 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
13110 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  e()..**.**     I
13120 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
13130 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13140 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d  ive mode, this m
13150 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a  ethod of finaliz
13160 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a  ing.**     the j
13170 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
13180 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65  ever used. Inste
13190 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ad, if the journ
131a0 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20  alMode is.**    
131b0 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
131c0 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
131d0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
131e0 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
131f0 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f   under.**     jo
13200 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13210 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ST is used inste
13220 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ad..**.** After 
13230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  the journal is f
13240 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61  inalized, the pa
13250 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47  ger moves to PAG
13260 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e  ER_READER state.
13270 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69  .** If running i
13280 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20  n non-exclusive 
13290 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74  rollback mode, t
132a0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  he lock on the f
132b0 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67  ile is .** downg
132c0 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45  raded to a SHARE
132d0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  D_LOCK..**.** SQ
132e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
132f0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
13300 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
13310 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
13320 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  g.** any of the 
13330 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  IO operations to
13340 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13350 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e  urnal file or un
13360 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  lock the.** data
13370 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f  base then the IO
13380 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13390 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
133a0 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  ser. If the .** 
133b0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e  operation to fin
133c0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
133d0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68  l file fails, th
133e0 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c  en the code stil
133f0 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e  l.** tries to un
13400 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
13410 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e  e file if not in
13420 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
13430 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63   If the.** unloc
13440 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  k operation fail
13450 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20  s as well, then 
13460 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13470 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  code related.** 
13480 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72  to the first err
13490 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28  or encountered (
134a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  the journal fina
134b0 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73  lization one) is
134c0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
134d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
134e0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
134f0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
13500 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20   int hasMaster, 
13510 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
13520 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13530 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
13540 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
13550 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13560 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
13570 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
13580 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
13590 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
135a0 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
135b0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f  tion */..  /* Do
135c0 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20   nothing if the 
135d0 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
135e0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
135f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
13600 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61  ** or at least a
13610 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
13620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
13630 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
13640 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
13650 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
13660 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61  ion active but a
13670 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
13680 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a  ater lock is.  *
13690 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f  * held under two
136a0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
136b0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41    **.  **   1. A
136c0 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
136d0 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  l hot-journal ro
136e0 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61  llback, it is ca
136f0 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20  lled with.  **  
13700 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45      eState==PAGE
13710 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b  R_NONE and eLock
13720 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13730 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  ..  **.  **   2.
13740 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   If a connection
13750 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f   with locking_mo
13760 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c  de=exclusive hol
13770 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
13780 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63  E .  **      loc
13790 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20  k switches back 
137a0 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  to locking_mode=
137b0 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20  normal and then 
137c0 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20  executes a.  ** 
137d0 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61       read-transa
137e0 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63  ction, this func
137f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
13800 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45  ith eState==PAGE
13810 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20  R_READER .  **  
13820 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45      and eLock==E
13830 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68  XCLUSIVE_LOCK wh
13840 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  en the read-tran
13850 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
13860 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
13870 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
13880 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
13890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
138a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
138b0 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70  ERROR );.  if( p
138c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
138d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
138e0 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  D && pPager->eLo
138f0 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  ck<RESERVED_LOCK
13900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13920 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
13930 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20  oints(pPager);. 
13940 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
13950 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
13960 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13970 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  al==0 );.  if( i
13980 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13990 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
139a0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
139b0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f  Pager) );..    /
139c0 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  * Finalize the j
139d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
139e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
139f0 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
13a00 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13a20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13a30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13a40 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20  _MEMORY );.     
13a50 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13a60 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13a70 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
13a80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a90 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13aa0 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  DE_TRUNCATE ){. 
13ab0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
13ac0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
13ad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
13ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
13b00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
13b10 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
13b20 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, 0);.      }. 
13b30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13b40 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
13b50 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
13b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13b70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13b80 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
13b90 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
13ba0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
13bb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13bc0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
13bd0 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a  ODE_WAL).    ){.
13be0 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a        rc = zeroJ
13bf0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13c00 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20  , hasMaster);.  
13c10 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13c20 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
13c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13c40 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
13c50 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
13c60 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
13c70 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20  de==MEMORY if.  
13c80 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75      ** a hot-jou
13c90 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f  rnal was just ro
13ca0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68  lled back. In th
13cb0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
13cc0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
13cd0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
13ce0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20  ed and deleted. 
13cf0 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  If this connecti
13d00 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20  on writes to.   
13d10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
13d20 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c  se file, it will
13d30 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20   do so using an 
13d40 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
13d50 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  l. .      */.   
13d60 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d     int bDelete =
13d70 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   (!pPager->tempF
13d80 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33 4a 6f  ile && sqlite3Jo
13d90 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50 61 67  urnalExists(pPag
13da0 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20  er->jfd));.     
13db0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13dc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13dd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13de0 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
13df0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e00 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13e20 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
13e30 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13e40 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13e50 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
13e60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
13e70 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13e80 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
13e90 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a   if( bDelete ){.
13ea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13eb0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
13ec0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
13ed0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
13ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13ef0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
13f00 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
13f10 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
13f20 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
13f30 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
13f40 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
13f50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
13f60 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
13f70 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
13f80 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13f90 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
13fa0 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b   *p = pager_look
13fb0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
13fc0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
13fd0 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
13fe0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
13ff0 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a 20  PagerUnref(p);. 
14000 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14010 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
14020 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
14030 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
14040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14050 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
14060 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
14070 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14080 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14090 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
140a0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
140b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
140c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
140d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
140e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
140f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
14100 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
14110 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
14120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
14130 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
14140 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
14150 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14160 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14170 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14180 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14190 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
141a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
141b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
141c0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
141d0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
141e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
141f0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14200 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14220 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14230 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14240 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14250 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14260 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14270 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14280 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14290 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
142a0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
142b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
142c0 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
142d0 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
142e0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
142f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14300 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14310 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14330 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14340 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14350 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14360 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14370 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14380 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14390 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
143a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
143b0 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
143c0 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
143d0 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
143e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
143f0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14400 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14410 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14420 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14430 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14440 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
14450 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
14460 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
14470 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
14480 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
14490 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
144a0 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
144b0 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
144c0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
144d0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
144e0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
144f0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
14500 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
14510 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
14520 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
14530 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
14540 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
14550 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
14560 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
14570 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
14580 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14590 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
145a0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
145b0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
145c0 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
145d0 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
145e0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
145f0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
14600 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
14610 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
14620 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
14630 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
14640 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14650 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
14660 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
14670 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
14680 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
14690 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
146a0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
146b0 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
146c0 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
146d0 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
146e0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
146f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
14700 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
14710 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
14720 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
14730 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
14740 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
14750 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
14760 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
14770 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14780 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
14790 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
147a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
147b0 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
147c0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
147d0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
147e0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
147f0 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
14800 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
14810 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
14820 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
14830 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
14840 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
14850 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14860 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
14870 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
14880 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
14890 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
148a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
148b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
148c0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
148d0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
148e0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
148f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
14900 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
14910 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
14920 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14930 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
14940 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
14950 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
14960 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14970 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
14980 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
14990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
149a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
149b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
149c0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
149d0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
149e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
149f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
14a00 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
14a10 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
14a20 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  n(pPager, 0, 0);
14a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
14a40 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
14a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
14a60 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
14a70 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14a80 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14a90 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
14aa0 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
14ab0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14ac0 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14ad0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14ae0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14af0 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14b00 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14b10 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14b30 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
14b40 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
14b50 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
14b60 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
14b70 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
14b80 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14b90 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
14ba0 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
14bb0 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14bc0 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14bd0 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14be0 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14bf0 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14c00 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14c10 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14c20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
14c30 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
14c40 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
14c50 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
14c60 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
14c70 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
14c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14c90 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
14ca0 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
14cb0 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14cc0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14cd0 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14ce0 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14cf0 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14d00 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14d10 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14d20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
14d30 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
14d40 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
14d50 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
14d60 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
14d70 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
14d80 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
14d90 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
14da0 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
14db0 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
14dc0 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
14dd0 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
14de0 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
14df0 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
14e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
14e10 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
14e20 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
14e30 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
14e40 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
14e50 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
14e60 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
14e70 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
14e80 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
14e90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
14ea0 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
14eb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14ec0 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
14ed0 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
14ee0 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
14ef0 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
14f00 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
14f10 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
14f20 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
14f30 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
14f40 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
14f50 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
14f60 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
14f70 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
14f80 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
14f90 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
14fa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14fb0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
14fc0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
14fd0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
14fe0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
14ff0 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
15000 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
15030 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
15040 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
15050 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
15060 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
15070 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
15080 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
15090 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
150a0 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
150b0 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
150c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
150d0 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
150e0 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
150f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
15100 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
15110 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
15120 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
15130 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
15140 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
15150 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
15160 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
15170 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
15180 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
15190 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
151a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
151b0 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
151c0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
151d0 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
151e0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
151f0 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
15200 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
15210 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
15220 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
15230 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15240 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
15250 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15260 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
15270 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
15280 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
15290 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
152a0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
152b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
152c0 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
152d0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
152e0 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
152f0 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
15300 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
15310 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
15320 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
15330 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
15340 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
15350 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
15360 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
15370 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
15380 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
15390 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
153a0 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
153b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
153c0 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
153d0 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
153e0 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
153f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
15400 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
15410 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
15420 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15430 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
15440 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
15450 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
15460 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
15470 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
15480 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
15490 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
154a0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
154b0 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
154c0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
154d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
154e0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
154f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
15500 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
15510 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
15520 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
15530 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15540 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
15550 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
15560 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
15570 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
15580 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
15590 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
155a0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
155b0 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
155c0 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
155d0 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
155e0 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
155f0 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
15600 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
15610 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
15620 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
15630 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
15640 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
15650 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
15660 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
15670 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
15680 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
15690 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
156a0 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
156b0 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
156c0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
156d0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
156e0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
156f0 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
15700 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
15710 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
15720 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
15730 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
15740 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
15750 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
15760 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
15770 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
15780 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15790 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
157a0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
157b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
157d0 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
157e0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
157f0 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15810 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
15820 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
15830 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
15840 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
15850 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
15860 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
15870 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
15880 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
15890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
158a0 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
158b0 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
158c0 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
158d0 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
158e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
158f0 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
15900 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
15910 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
15920 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
15930 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
15940 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
15950 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
15960 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
15970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15980 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15990 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
159a0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
159b0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
159c0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
159d0 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
159e0 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
159f0 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a10 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
15a20 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
15a30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
15a40 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
15a50 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
15a60 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
15a70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
15a80 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
15a90 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15aa0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
15ab0 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
15ac0 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
15ad0 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
15ae0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
15af0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
15b00 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15b10 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
15b20 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
15b30 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
15b40 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
15b50 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
15b60 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
15b70 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
15b80 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
15b90 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
15ba0 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
15bb0 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
15bc0 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
15bd0 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
15be0 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
15bf0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15c00 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
15c10 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
15c20 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
15c30 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
15c40 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
15c50 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
15c60 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
15c70 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
15c80 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
15c90 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
15ca0 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
15cb0 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
15cc0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
15cd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15ce0 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
15cf0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
15d00 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
15d10 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
15d20 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
15d30 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
15d40 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
15d50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15d60 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
15d70 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
15d80 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
15d90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15da0 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
15db0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
15dc0 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
15dd0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
15de0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
15df0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
15e00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15e10 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15e20 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
15e30 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
15e40 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
15e50 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
15e60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
15e70 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
15e80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
15e90 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
15ea0 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
15eb0 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
15ec0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
15ed0 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
15ee0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
15ef0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
15f00 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
15f10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
15f20 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
15f30 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15f40 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
15f50 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
15f60 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
15f70 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
15f80 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
15f90 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
15fa0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15fb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
15fc0 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
15fd0 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
15fe0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
15ff0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
16000 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
16010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
16030 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
16040 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
16050 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
16060 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
16070 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
16080 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
16090 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
160a0 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
160b0 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
160c0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
160d0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
160e0 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
160f0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
16100 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
16110 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
16120 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16130 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
16140 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
16150 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
16160 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
16170 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
16180 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
16190 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
161a0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
161b0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
161c0 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
161d0 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
161e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
161f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
16200 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
16210 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
16220 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
16230 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
16240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16250 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
16260 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
16270 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16280 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
16290 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
162a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
162b0 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
162c0 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
162d0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
162e0 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
162f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
16300 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
16310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16320 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
16330 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
16340 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67  by before during
16350 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
16360 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  * rollback, then
16370 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f   don't bother to
16380 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67   play it back ag
16390 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ain..  */.  if( 
163a0 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
163b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
163c0 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
163d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
163e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
163f0 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e    /* When playin
16400 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72  g back page 1, r
16410 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65  estore the nRese
16420 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f  rve setting.  */
16430 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26  .  if( pgno==1 &
16440 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  & pPager->nReser
16450 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29  ve!=((u8*)aData)
16460 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67  [20] ){.    pPag
16470 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
16480 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b  (u8*)aData)[20];
16490 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
164a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
164b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
164c0 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45  ager is in CACHE
164d0 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  MOD state, then 
164e0 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
164f0 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
16500 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
16510 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
16520 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
16530 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
16540 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
16550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16560 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
16570 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
16580 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
16590 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
165a0 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
165b0 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
165c0 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
165d0 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
165e0 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
165f0 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
16600 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
16610 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16620 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
16630 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16640 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
16650 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
16660 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
16670 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
16680 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
16690 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
166a0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
166b0 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
166c0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
166d0 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
166e0 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
166f0 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
16700 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
16710 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44  * If in WRITER_D
16720 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e  BMOD, WRITER_FIN
16730 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74  ISHED or OPEN st
16740 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
16750 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ate the.  ** pag
16760 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
16770 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61  xists and the ma
16780 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
16790 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
167a0 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79   .  ** not dirty
167b0 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64  . Since this cod
167c0 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74  e is only execut
167d0 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ed in PAGER_OPEN
167e0 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20   state for.  ** 
167f0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16800 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75  llback, it is gu
16810 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16820 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20  e page-cache is 
16830 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68  empty.  ** if th
16840 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50  e pager is in OP
16850 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20  EN state..  **. 
16860 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
16870 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
16880 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
16890 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
168a0 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
168b0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
168c0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
168d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
168e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
168f0 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
16900 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
16910 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
16920 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
16930 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
16940 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
16950 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
16960 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
16970 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
16980 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
16990 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
169a0 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
169b0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
169c0 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
169d0 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
169e0 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
169f0 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79   contents are sy
16a00 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61  nced into the ma
16a10 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
16a20 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
16a30 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f  wise, a power lo
16a40 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d  ss might leave m
16a50 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20  odified data in 
16a60 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16a70 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  e file without a
16a80 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72  n entry in the r
16a90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16aa0 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65  that can.  ** re
16ab0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
16ac0 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
16ad0 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f  al form.  Two co
16ae0 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
16af0 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65  .  ** met before
16b00 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
16b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20  database files. 
16b20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
16b30 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f   must be.  ** lo
16b40 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
16b50 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
16b60 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
16b70 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65  t is fully synce
16b80 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61  d.  ** in the ma
16b90 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
16ba0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
16bb0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16bc0 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  he or else.  ** 
16bd0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b  the page is mark
16be0 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
16bf0 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30  0..  **.  ** 200
16c00 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61  8-04-14:  When a
16c10 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63  ttempting to vac
16c20 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  uum a corrupt da
16c30 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a  tabase file, it.
16c40 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
16c50 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65   to fail a state
16c60 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61  ment on a databa
16c70 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  se that does not
16c80 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a   yet exist..  **
16c90 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   Do not attempt 
16ca0 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61  to write if data
16cb0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65  base file has ne
16cc0 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  ver been opened.
16cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  .  */.  if( page
16ce0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
16cf0 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
16d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
16d10 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
16d20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
16d30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16d40 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
16d50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16d60 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
16d70 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a  EN || pPg==0 );.
16d80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
16d90 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
16da0 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
16db0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16dc0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16dd0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
16de0 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
16df0 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
16e00 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
16e10 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
16e20 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
16e30 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
16e40 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
16e50 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
16e60 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
16e70 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
16e80 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
16e90 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
16ea0 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
16eb0 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
16ec0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
16ed0 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
16ee0 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  }.  if( isOpen(p
16ef0 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
16f00 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
16f10 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
16f20 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
16f30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
16f40 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  EN).   && isSync
16f50 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
16f60 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
16f70 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
16f80 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
16f90 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
16fa0 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
16fb0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
16fc0 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
16fd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
16fe0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16ff0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
17000 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
17010 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61  er->fd, (u8*)aDa
17020 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
17030 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
17040 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
17050 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
17060 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
17070 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
17080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17090 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
170a0 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
170b0 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
170c0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
170d0 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
170e0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
170f0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
17100 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
17110 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44  Data);.      COD
17120 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
17130 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
17140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61  QLITE_NOMEM, aDa
17150 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ta);.    }.  }el
17160 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72  se if( !isMainJr
17170 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a  nl && pPg==0 ){.
17180 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
17190 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  s a rollback of 
171a0 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  a savepoint and 
171b0 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69  data was not wri
171c0 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74  tten to.    ** t
171d0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
171e0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
171f0 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65  in-memory, there
17200 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a   is a potential.
17210 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20      ** problem. 
17220 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  When the page is
17230 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79   next fetched by
17240 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65   the b-tree laye
17250 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  r, it .    ** wi
17260 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
17270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17280 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  e, which may or 
17290 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  may not be .    
172a0 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20  ** current. .   
172b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65   **.    ** There
172c0 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66   are a couple of
172d0 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20   different ways 
172e0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e  this can happen.
172f0 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20   All are quite. 
17300 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57     ** obscure. W
17310 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73  hen running in s
17320 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
17330 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   this can only h
17340 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66  appen .    ** if
17350 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20   the page is on 
17360 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74  the free-list at
17370 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
17380 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  e transaction, t
17390 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c  hen.    ** popul
173a0 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64  ated, then moved
173b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
173c0 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20  gerMovepage().. 
173d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
173e0 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
173f0 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  add an in-memory
17400 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63   page to the cac
17410 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  he containing.  
17420 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75    ** the data ju
17430 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  st read from the
17440 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61   sub-journal. Ma
17450 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
17460 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64  irty .    ** and
17470 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65   if the pager re
17480 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c  quires a journal
17490 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b  -sync, then mark
174a0 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20   the page as .  
174b0 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61    ** requiring a
174c0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65   journal-sync be
174d0 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74  fore it is writt
174e0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  en..    */.    a
174f0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
17500 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17510 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17520 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  ll==0 );.    pPa
17530 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2b  ger->doNotSpill+
17540 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  +;.    rc = sqli
17550 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
17560 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17570 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Pg, 1);.    asse
17580 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17590 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20  tSpill==1 );.   
175a0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
175b0 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20 72  ill--;.    if( r
175c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
175d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
175e0 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
175f0 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
17600 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
17610 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
17620 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
17630 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
17640 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
17650 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
17660 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
17670 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
17680 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
17690 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
176a0 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
176b0 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
176c0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
176d0 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
176e0 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
176f0 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
17700 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
17710 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
17720 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
17730 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
17740 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
17750 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
17760 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
17770 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
17780 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
17790 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
177a0 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75  memcpy(pData, (u
177b0 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
177c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
177d0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
177e0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  er(pPg);.    if(
177f0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28   isMainJrnl && (
17800 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70  !isSavepnt || *p
17810 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e  Offset<=pPager->
17820 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20  journalHdr) ){. 
17830 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
17840 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
17850 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72  page were just r
17860 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65  estored from the
17870 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20   main .      ** 
17880 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17890 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d  en its content m
178a0 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77  ust be as they w
178b0 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20  ere when the .  
178c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
178d0 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  on was first ope
178e0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
178f0 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68  e we can mark th
17900 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
17910 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20  as clean, since 
17920 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f  there will be no
17930 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69   need to write i
17940 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20  t out to the.   
17950 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a     ** database..
17960 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17970 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65  * There is one e
17980 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73  xception to this
17990 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61   rule. If the pa
179a0 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  ge is being roll
179b0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
179c0 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61   as part of a sa
179d0 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74  vepoint (or stat
179e0 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20  ement) rollback 
179f0 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a  from an .      *
17a00 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  * unsynced porti
17a10 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  on of the main j
17a20 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
17a30 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65  n it is not safe
17a40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72  .      ** to mar
17a50 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
17a60 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63  ean. This is bec
17a70 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65  ause marking the
17a80 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a   page as.      *
17a90 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65  * clean will cle
17aa0 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
17ab0 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e  D_SYNC flag. Sin
17ac0 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  ce the page is. 
17ad0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17ae0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
17af0 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e  ile (recorded in
17b00 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
17b10 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  l) and.      ** 
17b20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
17b30 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61  YNC flag is clea
17b40 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65  red, if the page
17b50 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20   is written to. 
17b60 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
17b70 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
17b80 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62  ction, it will b
17b90 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
17ba0 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  y but.      ** t
17bb0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17bc0 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74  NC flag will not
17bd0 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c   be set. It coul
17be0 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c  d then potential
17bf0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77  ly.      ** be w
17c00 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20  ritten out into 
17c10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17c20 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75  e before its jou
17c30 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20  rnal file.      
17c40 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79  ** segment is sy
17c50 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68  nced. If a crash
17c60 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f   occurs during o
17c70 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  r following this
17c80 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  ,.      ** datab
17c90 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  ase corruption m
17ca0 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20  ay ensue..      
17cb0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
17cc0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17cd0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73  ager) );.      s
17ce0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17cf0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
17d00 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  }.    pager_set_
17d10 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a  pagehash(pPg);..
17d20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
17d30 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
17d40 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
17d50 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
17d60 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
17d70 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
17d80 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
17d90 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
17da0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
17db0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17dc0 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
17dd0 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
17de0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
17df0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17e00 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
17e10 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
17e20 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
17e30 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
17e40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
17e50 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
17e60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
17e70 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
17e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
17ea0 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
17eb0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
17ec0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
17ed0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
17ee0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
17ef0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
17f00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17f10 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
17f20 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
17f30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
17f40 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
17f50 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
17f60 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
17f70 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
17f80 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
17f90 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
17fa0 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
17fb0 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
17fc0 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
17fd0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
17fe0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
17ff0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
18000 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
18010 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
18020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18030 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18040 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18050 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18060 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18070 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18080 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18090 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
180a0 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
180b0 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
180c0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
180d0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
180e0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
180f0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
18100 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
18110 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18120 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18130 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18140 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18150 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18160 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18170 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18180 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18190 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
181a0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
181b0 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
181c0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
181d0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
181e0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
181f0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18200 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18210 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18220 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18230 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18240 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18250 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18260 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18270 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18280 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18290 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
182a0 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
182b0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
182c0 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
182d0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
182e0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
182f0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18300 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18310 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18320 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18330 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18340 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18350 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18360 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18370 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18380 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18390 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
183a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
183b0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
183c0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
183d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
183e0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
183f0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18400 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18410 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18420 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18430 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18440 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18450 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18460 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18470 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18480 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18490 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
184a0 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
184b0 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
184c0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
184d0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
184e0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
184f0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18500 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18510 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18520 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18530 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18550 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18560 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18570 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18580 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18590 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
185a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
185b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
185c0 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
185d0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
185e0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
185f0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18600 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18610 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18630 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18640 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18650 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18660 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18670 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18680 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
186b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
186c0 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
186d0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
186e0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
186f0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18700 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18710 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18720 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
18730 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18740 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
18750 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
18760 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
18770 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
18780 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
18790 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
187a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
187b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
187c0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
187d0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
187e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
187f0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
18800 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
18810 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
18820 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
18830 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
18840 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
18850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
18860 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
18870 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18880 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
18890 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
188a0 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
188b0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
188c0 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
188d0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
188e0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
188f0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
18900 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
18910 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18920 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
18930 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
18940 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
18950 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
18960 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
18970 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
18980 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
18990 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
189a0 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
189b0 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
189c0 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
189d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
189e0 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
189f0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
18a00 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
18a10 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
18a20 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
18a30 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
18a40 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
18a50 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
18a60 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
18a70 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
18a80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18a90 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
18aa0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
18ab0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
18ac0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
18ad0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
18ae0 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
18af0 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
18b00 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
18b10 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
18b20 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
18b30 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
18b40 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
18b50 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
18b60 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
18b70 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
18b80 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
18b90 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
18ba0 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
18bb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
18bc0 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
18bd0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
18be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18bf0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18c00 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
18c10 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
18c20 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
18c30 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18c40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69  sqlite3Malloc((i
18c50 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
18c60 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
18c70 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
18c80 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
18c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18ca0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  MEM;.    goto de
18cb0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
18cc0 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
18cd0 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
18ce0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
18cf0 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
18d00 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
18d10 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
18d20 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
18d30 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
18d40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18d50 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18d60 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
18d70 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
18d80 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
18d90 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
18da0 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
18db0 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
18dc0 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
18dd0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
18de0 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
18df0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
18e00 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
18e10 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
18e20 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
18e30 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
18e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18e50 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18e60 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
18e70 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
18e80 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
18e90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
18ea0 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
18eb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
18ec0 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
18ed0 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
18ee0 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
18ef0 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
18f00 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
18f10 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
18f20 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
18f30 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18f40 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
18f50 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
18f60 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
18f70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18f80 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18f90 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
18fa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18fb0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18fc0 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
18fd0 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
18fe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19000 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19010 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
19020 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
19030 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
19040 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
19050 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
19060 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19070 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
19080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
190a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
190b0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
190c0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
190d0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
190e0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
190f0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
19100 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
19110 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
19120 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
19130 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
19140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
19150 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19160 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
19180 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
19190 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
191a0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
191b0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
191c0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
191d0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
191e0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
191f0 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
19200 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
19210 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
19220 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
19230 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
19240 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19250 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19260 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
19270 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
19280 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
19290 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
192a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
192b0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
192c0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
192d0 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
192e0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
192f0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
19300 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
19310 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
19320 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
19330 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
19340 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
19350 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
19360 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
19370 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
19380 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
19390 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
193a0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
193b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
193c0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
193d0 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
193e0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
193f0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
19400 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
19410 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
19420 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
19430 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
19440 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
19450 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
19460 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
19470 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
19480 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
19490 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
194a0 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
194b0 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
194c0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
194d0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
194e0 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
194f0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
19500 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
19510 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
19520 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
19530 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
19540 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
19550 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
19560 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
19570 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
19580 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
19590 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
195a0 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
195b0 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
195c0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
195d0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
195e0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
195f0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
19600 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
19610 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
19620 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19630 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
19640 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
19650 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
19660 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
19670 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
19680 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
19690 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
196a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
196b0 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
196c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
196d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
196e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
196f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19700 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
19710 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
19720 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19730 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
19740 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
19750 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
19760 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
19770 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
19780 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
19790 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
197a0 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
197b0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
197c0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
197d0 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
197e0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
197f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19800 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19810 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19820 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19830 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19840 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19850 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
19860 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
19870 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
19880 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
19890 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
198a0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
198b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
198c0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
198d0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
198e0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
198f0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
19900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19910 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
19920 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
19930 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
19940 69 7a 65 3c 70 50 61 67 65 72 2d 3e 6e 4d 61 70  ize<pPager->nMap
19950 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Valid ){.       
19960 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 56     pPager->nMapV
19970 61 6c 69 64 20 3d 20 6e 65 77 53 69 7a 65 3b 0a  alid = newSize;.
19980 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19990 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
199a0 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
199b0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
199c0 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
199d0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
199e0 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
199f0 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
19a00 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
19a10 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19a20 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
19a30 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19a40 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
19a50 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
19a60 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
19a70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19a80 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
19a90 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
19aa0 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
19ab0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
19ac0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19ad0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19ae0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
19af0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
19b00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19b10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19b20 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
19b30 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
19b40 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
19b50 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
19b60 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
19b70 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
19b80 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
19b90 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
19ba0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
19bb0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
19bc0 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
19bd0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
19be0 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
19bf0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
19c00 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
19c10 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
19c20 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
19c30 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
19c40 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
19c50 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19c60 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19c70 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
19c80 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
19c90 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
19ca0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
19cb0 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
19cc0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
19cd0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
19ce0 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
19cf0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
19d00 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
19d10 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
19d20 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
19d30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19d40 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
19d50 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
19d60 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
19d70 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
19d80 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
19d90 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
19da0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
19db0 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
19dc0 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
19dd0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
19de0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
19df0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
19e00 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
19e10 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
19e20 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
19e30 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
19e40 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
19e50 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19e60 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
19e70 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19e80 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
19e90 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
19ea0 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
19eb0 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
19ec0 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
19ed0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
19ee0 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
19ef0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
19f00 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
19f10 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
19f20 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
19f30 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19f40 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
19f50 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
19f60 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
19f70 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
19f80 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
19f90 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
19fa0 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
19fb0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19fc0 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
19fd0 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
19fe0 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
19ff0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1a000 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1a010 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1a020 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1a030 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1a040 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1a050 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1a060 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1a070 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1a080 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1a090 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1a0a0 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1a0b0 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1a0c0 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1a0d0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1a0e0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1a0f0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1a100 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1a110 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1a120 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a130 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1a140 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1a150 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1a160 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a170 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1a180 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1a190 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1a1a0 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1a1b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1a1c0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1a1d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a1e0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1a1f0 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1a200 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a210 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a220 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1a230 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1a240 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1a250 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1a260 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1a270 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1a280 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1a290 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1a2a0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1a2b0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1a2c0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1a2d0 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1a2e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1a2f0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1a300 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a310 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1a320 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1a330 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1a340 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1a350 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1a360 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1a370 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1a380 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1a390 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1a3a0 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1a3b0 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1a3c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a3d0 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1a3e0 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1a3f0 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1a400 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1a410 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1a420 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1a430 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1a440 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1a450 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1a460 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1a470 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1a480 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1a490 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1a4a0 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1a4b0 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1a4c0 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1a4d0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1a4e0 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1a4f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1a500 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1a510 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1a520 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1a530 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1a540 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1a550 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1a560 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1a570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1a580 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1a590 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1a5a0 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1a5b0 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1a5c0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a5d0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a5e0 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1a5f0 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1a600 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1a610 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1a620 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1a630 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1a640 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1a650 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1a660 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1a670 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1a680 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1a690 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1a6a0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1a6b0 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1a6c0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1a6d0 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1a6e0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1a6f0 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1a700 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1a710 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1a720 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1a730 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1a740 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1a750 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1a760 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1a770 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1a780 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1a790 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1a7a0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1a7b0 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1a7c0 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1a7d0 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1a7e0 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1a7f0 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1a800 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1a810 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1a820 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1a830 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1a840 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1a850 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1a860 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1a870 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a880 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1a890 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1a8a0 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1a8b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1a8c0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1a8d0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1a8e0 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1a8f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1a900 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1a910 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1a920 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1a930 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1a940 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1a950 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1a960 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1a970 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1a980 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1a990 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1a9a0 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1a9b0 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1a9c0 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1a9d0 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1a9e0 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1a9f0 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1aa00 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1aa10 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1aa20 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1aa30 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1aa40 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1aa50 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1aa60 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1aa70 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1aa80 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1aa90 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1aaa0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1aab0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1aac0 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1aad0 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1aae0 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1aaf0 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1ab00 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1ab10 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1ab20 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1ab30 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1ab40 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1ab50 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1ab60 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1ab70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ab80 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1ab90 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1aba0 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1abb0 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1abc0 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1abd0 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1abe0 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1abf0 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1ac00 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1ac10 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1ac20 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1ac30 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1ac40 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1ac50 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1ac60 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1ac70 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1ac80 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1ac90 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1aca0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1acb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1acc0 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1acd0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1ace0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1acf0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1ad00 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1ad10 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1ad20 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1ad30 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1ad40 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1ad50 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1ad60 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1ad70 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1ad80 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1ad90 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1ada0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1adb0 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1adc0 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1add0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1ade0 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1adf0 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1ae00 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1ae10 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1ae20 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1ae30 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1ae40 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1ae50 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1ae60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ae70 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1ae80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1ae90 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1aea0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1aeb0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1aec0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1aee0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1aef0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1af00 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1af10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1af20 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1af30 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1af40 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af60 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1af70 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1af80 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1af90 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1afa0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1afb0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1afc0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1afd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1afe0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1aff0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b000 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1b010 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1b020 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1b030 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1b040 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1b050 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1b060 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1b070 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1b080 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1b090 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1b0a0 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1b0b0 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1b0c0 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1b0d0 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
1b0e0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1b0f0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1b100 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1b110 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1b120 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1b130 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1b140 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b150 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1b160 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b170 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1b180 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1b190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b1a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b1b0 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1b1c0 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1b1d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1b1e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b1f0 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1b200 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1b210 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b220 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1b230 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1b240 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1b250 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1b260 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b270 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1b280 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b290 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1b2a0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1b2b0 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1b2c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1b2d0 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1b2e0 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1b2f0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1b300 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1b310 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1b320 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1b330 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1b340 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b350 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1b360 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1b370 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1b380 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
1b390 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1b3a0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1b3b0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1b3c0 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1b3d0 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1b3e0 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1b3f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b400 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1b410 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1b420 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1b430 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1b440 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1b450 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b460 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1b470 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1b480 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1b490 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1b4a0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1b4b0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1b4c0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1b4d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b4e0 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1b4f0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1b500 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1b510 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1b520 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1b530 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1b540 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1b550 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1b560 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1b570 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1b580 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b590 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1b5a0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1b5b0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1b5c0 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1b5d0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1b5e0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1b5f0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1b600 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1b610 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1b620 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1b630 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1b640 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1b650 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1b660 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1b670 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1b680 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1b690 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1b6a0 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1b6b0 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1b6c0 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1b6d0 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1b6e0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1b6f0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1b700 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1b710 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1b720 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1b730 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1b740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b750 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1b760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1b770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b790 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1b7a0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1b7b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1b7c0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1b7d0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1b7e0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1b7f0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1b800 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1b810 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1b820 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1b830 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1b840 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1b850 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1b860 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1b870 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1b880 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1b890 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1b8a0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1b8b0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1b8c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b8d0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1b8e0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1b8f0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1b900 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1b910 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1b920 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1b930 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1b940 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1b950 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1b960 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1b970 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1b980 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1b990 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1b9a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1b9b0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1b9c0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1b9d0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1b9e0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1b9f0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1ba00 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1ba10 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1ba20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1ba30 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1ba40 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1ba50 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1ba60 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1ba70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1ba80 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1ba90 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1baa0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1bab0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1bac0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1bad0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1bae0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1baf0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1bb00 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1bb10 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1bb20 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1bb30 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1bb40 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1bb50 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1bb60 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1bb70 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1bb80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1bb90 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1bba0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1bbb0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1bbc0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1bbd0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1bbe0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1bbf0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1bc00 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1bc10 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1bc20 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1bc30 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1bc40 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1bc50 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1bc60 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1bc70 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1bc80 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1bc90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1bca0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1bcb0 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1bcc0 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1bcd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1bce0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1bcf0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1bd00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1bd10 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1bd20 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1bd30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1bd40 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1bd50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1bd60 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1bd70 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1bd80 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1bd90 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1bda0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1bdb0 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1bdc0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1bdd0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1bde0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1bdf0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1be00 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1be10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1be20 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1be30 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1be40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1be50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1be60 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1be70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1be80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1be90 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1bea0 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1beb0 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1bec0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1bed0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1bee0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1bef0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1bf00 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1bf10 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1bf20 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1bf30 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1bf40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1bf50 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1bf60 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1bf70 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1bf80 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1bf90 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1bfa0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1bfb0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1bfc0 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1bfd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bfe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1bff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1c000 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1c010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c020 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
1c030 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
1c050 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1c060 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1c070 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1c080 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
1c090 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
1c0a0 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
1c0b0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
1c0c0 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
1c0d0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
1c0e0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
1c0f0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
1c100 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
1c110 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
1c120 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
1c130 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
1c140 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
1c150 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
1c160 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
1c170 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
1c180 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
1c190 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
1c1a0 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
1c1b0 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
1c1c0 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
1c1d0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
1c1e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c1f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1c200 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1c210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c220 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
1c230 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
1c240 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
1c250 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
1c260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1c270 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
1c280 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
1c290 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
1c2a0 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
1c2b0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
1c2c0 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
1c2d0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
1c2e0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
1c2f0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c300 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
1c310 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
1c320 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
1c330 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
1c340 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
1c350 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c370 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
1c380 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
1c390 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
1c3a0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
1c3b0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
1c3c0 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
1c3d0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1c3e0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
1c3f0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
1c400 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
1c410 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
1c420 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
1c430 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
1c440 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1c450 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
1c460 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
1c470 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
1c480 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
1c490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1c4a0 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
1c4b0 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ed..  */.#ifdef 
1c4c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1c4d0 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
1c4e0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73  Methods ){.    s
1c4f0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1c500 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
1c510 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  fd,SQLITE_FCNTL_
1c520 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b  DB_UNCHANGED,0);
1c530 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1c540 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1c550 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1c560 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1c570 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1c580 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1c590 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1c5a0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1c5b0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1c5c0 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1c5d0 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1c5e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1c5f0 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1c600 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1c610 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1c620 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1c630 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1c640 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1c650 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1c660 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1c670 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1c680 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1c690 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1c6a0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1c6b0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1c6c0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1c6d0 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1c6e0 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1c6f0 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1c700 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1c710 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1c720 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1c730 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1c740 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1c750 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1c760 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1c770 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1c780 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1c790 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1c7a0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1c7b0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1c7c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c7d0 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1c7e0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1c7f0 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1c800 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1c810 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1c820 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1c830 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1c840 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c860 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c870 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70  LITE_OK.   && (p
1c880 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1c890 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1c8a0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1c8b0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1c8c0 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
1c8d0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1c8e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1c8f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c900 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1c910 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1c920 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
1c930 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b  er[0]!='\0', 0);
1c940 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c960 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1c970 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1c980 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1c990 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c9a0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1c9b0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1c9c0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1c9d0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1c9e0 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1c9f0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1ca00 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1ca10 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1ca20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1ca30 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1ca40 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1ca50 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1ca60 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
1ca70 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1ca80 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1ca90 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1caa0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1cab0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1cac0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1cad0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1cae0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1caf0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1cb00 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1cb10 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1cb20 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1cb30 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1cb40 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1cb50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cb60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1cb70 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1cb80 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1cb90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cba0 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1cbb0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1cbc0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1cbd0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1cbe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1cbf0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1cc00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cc10 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1cc20 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1cc30 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1cc40 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1cc50 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1cc60 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1cc70 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1cc80 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1cc90 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1cca0 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1ccb0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1ccc0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1ccd0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1cce0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1ccf0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1cd00 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1cd10 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1cd20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1cd30 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1cd40 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1cd50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1cd60 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1cd70 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1cd80 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1cd90 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1cda0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1cdb0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1cdc0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1cdd0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
1cde0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1cdf0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
1ce00 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
1ce10 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1ce20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1ce30 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1ce40 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1ce50 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1ce60 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1ce70 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1ce80 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1ce90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1cea0 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  fd) );..  if( NE
1ceb0 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67  VER(!isOpen(pPag
1cec0 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20  er->fd)) ){.    
1ced0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cee0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1cef0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1cf00 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1cf10 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74  geSize);.    ret
1cf20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1cf30 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
1cf40 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
1cf50 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70  .    /* Try to p
1cf60 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f  ull the page fro
1cf70 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  m the write-ahea
1cf80 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63  d log. */.    rc
1cf90 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61   = sqlite3WalRea
1cfa0 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  d(pPager->pWal, 
1cfb0 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20  pgno, &isInWal, 
1cfc0 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61  pgsz, pPg->pData
1cfd0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1cfe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69  =SQLITE_OK && !i
1cff0 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36  sInWal ){.    i6
1d000 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d010 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d020 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d030 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 61 70  if( pPager->pMap
1d040 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70   && pPager->nMap
1d050 56 61 6c 69 64 3e 3d 69 4f 66 66 73 65 74 2b 70  Valid>=iOffset+p
1d060 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1d070 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1d080 70 50 67 2d 3e 70 44 61 74 61 2c 20 26 28 28 75  pPg->pData, &((u
1d090 38 20 2a 29 28 70 50 61 67 65 72 2d 3e 70 4d 61  8 *)(pPager->pMa
1d0a0 70 29 29 5b 69 4f 66 66 73 65 74 5d 2c 20 70 50  p))[iOffset], pP
1d0b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d0c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d0d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d0e0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1d0f0 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73   pPg->pData, pgs
1d100 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  z, iOffset);.   
1d110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d120 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d130 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  AD ){.        rc
1d140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d160 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1d170 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1d180 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d190 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1d1a0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1d1b0 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1d1c0 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1d1d0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1d1e0 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1d1f0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1d200 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1d210 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1d220 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1d230 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1d240 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1d250 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1d260 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1d270 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1d280 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1d290 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1d2a0 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1d2b0 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1d2c0 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1d2d0 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1d2e0 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1d2f0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1d300 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1d310 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1d320 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1d330 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d340 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1d350 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1d360 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1d370 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1d380 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1d390 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1d3a0 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1d3b0 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1d3c0 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1d3d0 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
1d3e0 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
1d3f0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d400 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d410 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d420 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d430 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d440 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d450 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d460 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d470 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d490 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d4a0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d4b0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d4c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d4d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d4e0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d4f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d500 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1d510 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1d520 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d530 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1d540 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1d550 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1d560 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1d570 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1d580 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1d590 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1d5a0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1d5b0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1d5c0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1d5d0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1d5e0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1d600 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1d610 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1d620 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1d630 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d640 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1d650 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1d660 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1d670 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1d680 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1d690 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1d6a0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1d6b0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1d6c0 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1d6d0 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1d6e0 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1d6f0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1d700 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1d710 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1d720 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1d730 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1d740 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1d750 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1d760 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1d770 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1d780 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1d790 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1d7a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1d7b0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1d7c0 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1d7d0 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1d7e0 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1d7f0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1d800 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1d810 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1d820 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1d830 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1d840 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1d850 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1d860 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1d870 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1d880 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d890 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1d8a0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1d8b0 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1d8c0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d8d0 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1d8e0 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1d8f0 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1d900 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1d910 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1d920 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d930 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1d940 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1d950 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1d960 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1d970 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1d980 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d990 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1d9a0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1d9b0 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1d9c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1d9d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d9e0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1d9f0 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1da00 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1da10 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1da20 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1da30 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1da40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1da50 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1da60 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1da70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1da80 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1da90 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1daa0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1dab0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1dac0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1dad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1dae0 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1daf0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1db00 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1db10 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1db20 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1db30 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1db40 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1db50 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1db60 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1db70 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1db80 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1db90 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1dba0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1dbb0 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1dbc0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1dbd0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1dbe0 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1dbf0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1dc00 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1dc10 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1dc20 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1dc30 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1dc40 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1dc50 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1dc60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1dc70 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1dc80 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1dc90 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1dca0 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69  g;..  pPg = sqli
1dcb0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1dcc0 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1dcd0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1dce0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1dcf0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1dd00 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1dd10 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1dd20 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1dd30 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1dd40 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
1dd50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dd60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1dd70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1dd80 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
1dd90 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1dda0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1ddb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72   }.  }..  /* Nor
1ddc0 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e  mally, if a tran
1ddd0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1dde0 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b  d back, any back
1ddf0 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  up processes are
1de00 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73  .  ** updated as
1de10 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64 20   data is copied 
1de20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  out of the rollb
1de30 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1de40 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
1de50 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20  tabase. This is 
1de60 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f  not generally po
1de70 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57 41  ssible with a WA
1de80 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20  L database, as. 
1de90 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76   ** rollback inv
1dea0 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75  olves simply tru
1deb0 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20  ncating the log 
1dec0 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c  file. Therefore,
1ded0 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20   if one.  ** or 
1dee0 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76 65  more frames have
1def0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1df00 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
1df10 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1df20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65  .  ** also copie
1df30 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75  d into the backu
1df40 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73 20  p databases) as 
1df50 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72 61  part of this tra
1df60 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74  nsaction,.  ** t
1df70 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20  he backups must 
1df80 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20  be restarted..  
1df90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  */.  sqlite3Back
1dfa0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
1dfb0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72  ->pBackup);..  r
1dfc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1dfd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1dfe0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
1dff0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e000 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61  tion on a WAL da
1e010 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1e020 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62  c int pagerRollb
1e030 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50  ackWal(Pager *pP
1e040 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e070 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48  rn Code */.  PgH
1e080 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20  dr *pList;      
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e0a0 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  List of dirty pa
1e0b0 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f  ges to revert */
1e0c0 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70  ..  /* For all p
1e0d0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1e0e0 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  e that are curre
1e0f0 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61  ntly dirty or ha
1e100 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
1e110 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75  been written (bu
1e120 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29  t not committed)
1e130 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
1e140 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  , do one of the 
1e150 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a  .  ** following:
1e160 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44  .  **.  **   + D
1e170 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68 65  iscard the cache
1e180 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63 6f  d page (if refco
1e190 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  unt==0), or.  **
1e1a0 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65     + Reload page
1e1b0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
1e1c0 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20 72  e database (if r
1e1d0 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f  efcount>0)..  */
1e1e0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1e1f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
1e200 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  igSize;.  rc = s
1e210 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50  qlite3WalUndo(pP
1e220 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65  ager->pWal, page
1e230 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  rUndoCallback, (
1e240 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a  void *)pPager);.
1e250 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1e260 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1e270 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1e280 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
1e290 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  t && rc==SQLITE_
1e2a0 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  OK ){.    PgHdr 
1e2b0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
1e2c0 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d  pDirty;.    rc =
1e2d0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e2e0 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65  ck((void *)pPage
1e2f0 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  r, pList->pgno);
1e300 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65  .    pList = pNe
1e310 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  xt;.  }..  retur
1e320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e340 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
1e350 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1e360 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20  s(). As well as 
1e370 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63  logging.** the c
1e380 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  ontents of the l
1e390 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65 61  ist of pages hea
1e3a0 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f  ded by pList (co
1e3b0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
1e3c0 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  y),.** this func
1e3d0 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e  tion notifies an
1e3e0 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70 20  y active backup 
1e3f0 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20 74  processes that t
1e400 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a  he pages have.**
1e410 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a   changed. .**.**
1e420 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   The list of pag
1e430 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74  es passed into t
1e440 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1e450 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79 20  lways sorted by 
1e460 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
1e470 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31  Hence, if page 1
1e480 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65 72   appears anywher
1e490 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69  e on the list, i
1e4a0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  t will be the fi
1e4b0 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74  rst page..*/ .st
1e4c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57 61  atic int pagerWa
1e4d0 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72  lFrames(.  Pager
1e4e0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
1e4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1e500 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1e510 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20  PgHdr *pList,   
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65  /* List of frame
1e540 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67  s to log */.  Pg
1e550 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20  no nTruncate,   
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e570 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   Database size a
1e580 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74  fter this commit
1e590 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1e5a0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
1e5b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e5c0 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1e5d0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1e5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e600 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e610 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20  t nList;        
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e630 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e640 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66   in pList */.#if
1e650 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1e660 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1e670 64 28 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  d(SQLITE_CHECK_P
1e680 41 47 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70  AGES).  PgHdr *p
1e690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e6a0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1e6b0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1e6c0 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  s */.#endif..  a
1e6d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1e6e0 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Wal );.  assert(
1e6f0 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66   pList );.#ifdef
1e700 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1e710 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1e720 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73 20  he page list is 
1e730 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
1e740 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c  er */.  for(p=pL
1e750 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69  ist; p && p->pDi
1e760 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  rty; p=p->pDirty
1e770 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e780 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72  ->pgno < p->pDir
1e790 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a  ty->pgno );.  }.
1e7a0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1e7b0 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  ( pList->pDirty=
1e7c0 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29  =0 || isCommit )
1e7d0 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ;.  if( isCommit
1e7e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1e7f0 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1e800 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1e810 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1e820 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1e830 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1e840 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1e850 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1e860 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1e870 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1e880 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1e890 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1e8a0 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1e8b0 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1e8c0 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1e8d0 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1e8e0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1e8f0 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1e900 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1e910 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1e920 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1e930 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1e940 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1e950 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1e960 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1e970 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1e980 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1e990 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1e9a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1e9b0 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1e9c0 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1e9d0 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1e9e0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1e9f0 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1ea00 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1ea10 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1ea20 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1ea30 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1ea40 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1ea50 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1ea60 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1ea70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1ea80 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1ea90 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1eaa0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1eab0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1eac0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1ead0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1eae0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
1eaf0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1eb00 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1eb10 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
1eb20 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
1eb30 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c  Backup, p->pgno,
1eb40 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29   (u8 *)p->pData)
1eb50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1eb60 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1eb70 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d  _PAGES.  pList =
1eb80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
1eb90 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
1eba0 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28  pPCache);.  for(
1ebb0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ebc0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61  >pDirty){.    pa
1ebd0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
1ebe0 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (p);.  }.#endif.
1ebf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ec00 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72  ./*.** Begin a r
1ec10 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
1ec20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a  on the WAL..**.*
1ec30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
1ec40 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  sed to be called
1ec50 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73   "pagerOpenSnaps
1ec60 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20 69  hot()" because i
1ec70 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a  t essentially.**
1ec80 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f   makes a snapsho
1ec90 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1eca0 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  e at the current
1ecb0 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61   point in time a
1ecc0 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20  nd preserves.** 
1ecd0 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f  that snapshot fo
1ece0 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65 61  r use by the rea
1ecf0 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20  der in spite of 
1ed00 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61  concurrently cha
1ed10 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72  nges by.** other
1ed20 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65 63   writers or chec
1ed30 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74  kpointers..*/.st
1ed40 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42 65  atic int pagerBe
1ed50 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1ed60 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
1ed70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1eda0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61  ode */.  int cha
1edb0 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  nged = 0;       
1edc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1edd0 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20 62   if cache must b
1ede0 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73  e reset */..  as
1edf0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1ee00 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  l(pPager) );.  a
1ee10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1ee20 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1ee30 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
1ee40 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
1ee50 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  R );..  /* sqlit
1ee60 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
1ee70 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
1ee80 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
1ee90 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
1eea0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
1eeb0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
1eec0 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
1eed0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
1eee0 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
1eef0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
1ef00 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
1ef10 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
1ef20 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
1ef30 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
1ef40 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
1ef50 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
1ef60 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
1ef70 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
1ef80 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
1ef90 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
1efa0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
1efb0 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
1efc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1efd0 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  | changed ){.   
1efe0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1eff0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
1f000 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1f010 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f020 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f030 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1f040 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1f050 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1f060 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1f070 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1f080 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f090 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1f0a0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1f0b0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1f0c0 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1f0d0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1f0e0 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1f0f0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f100 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f110 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1f120 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f130 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1f140 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1f150 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1f160 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1f170 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1f180 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1f190 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f1a0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f1b0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1f1c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1f1d0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1f1e0 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1f1f0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1f200 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f210 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1f220 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1f230 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1f240 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1f250 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1f260 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1f270 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1f280 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1f290 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1f2a0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1f2b0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1f2c0 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1f2d0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f2e0 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1f2f0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1f300 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1f310 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1f320 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f330 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1f340 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1f350 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1f360 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1f370 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1f380 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f390 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f3a0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f3b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f3c0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f3d0 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1f3e0 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1f3f0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1f400 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
1f410 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
1f420 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72  not available fr
1f430 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  om the WAL sub-s
1f440 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65  ystem,.  ** dete
1f450 72 6d 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f  rmine it based o
1f460 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1f470 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f480 20 49 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a   If the size.  *
1f490 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
1f4a0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1f4b0 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1f4c0 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1f4d0 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64  ze,.  ** round d
1f4e0 6f 77 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65  own to the neare
1f4f0 73 74 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c  st page. Except,
1f500 20 61 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72   any file larger
1f510 20 74 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74   than 0.  ** byt
1f520 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
1f530 6e 73 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74  nsidered to cont
1f540 61 69 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ain at least one
1f550 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1f560 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1f570 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
1f5a0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1f5b0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
1f5c0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1f5d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1f5e0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
1f5f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1f600 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
1f610 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1f620 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1f630 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  &n);.      if( r
1f640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f660 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f670 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
1f680 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
1f690 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
1f6a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f6b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1f6c0 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
1f6d0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1f6e0 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
1f6f0 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
1f700 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
1f710 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
1f720 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1f730 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
1f740 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1f750 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
1f760 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
1f770 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1f780 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1f790 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
1f7a0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
1f7b0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
1f7c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f7d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f7e0 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
1f7f0 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
1f800 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
1f810 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
1f820 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1f830 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
1f840 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
1f850 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
1f860 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
1f870 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
1f880 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
1f890 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
1f8a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f8b0 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
1f8c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1f8d0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
1f8e0 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
1f8f0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
1f900 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
1f910 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
1f920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f930 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
1f940 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
1f950 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
1f960 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
1f970 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
1f980 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
1f990 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
1f9a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
1f9b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1f9c0 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
1f9d0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1f9e0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1f9f0 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
1fa00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1fa10 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
1fa20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1fa30 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
1fa40 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1fa50 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
1fa60 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
1fa70 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
1fa80 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
1fa90 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
1faa0 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
1fab0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
1fac0 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
1fad0 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
1fae0 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
1faf0 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
1fb00 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
1fb10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
1fb20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
1fb30 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
1fb40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1fb50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fb60 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1fb70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1fb80 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1fb90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fba0 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1fbb0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
1fbc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1fbd0 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
1fc00 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
1fc10 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1fc40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fc50 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
1fc60 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1fc70 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
1fc80 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1fc90 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
1fca0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
1fcb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1fcc0 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
1fcd0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1fce0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1fcf0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  ==SQLITE_IOERR_D
1fd00 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63  ELETE_NOENT ) rc
1fd10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fd20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20      isWal = 0;. 
1fd30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fd40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1fd50 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
1fd60 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1fd70 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
1fd80 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1fd90 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29  , &isWal.      )
1fda0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fdb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fdc0 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
1fdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1fde0 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
1fdf0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
1fe00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
1fe10 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1fe20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1fe30 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
1fe40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1fe50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fe60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
1fe70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
1fe80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1fe90 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
1fea0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
1feb0 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
1fec0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1fed0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
1fee0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
1fef0 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
1ff00 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
1ff10 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
1ff20 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
1ff30 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
1ff40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1ff50 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
1ff60 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
1ff70 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
1ff80 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
1ff90 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
1ffa0 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
1ffb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1ffc0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
1ffd0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
1ffe0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
1fff0 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
20000 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
20010 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
20020 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
20030 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
20040 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
20050 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
20060 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
20070 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
20080 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
20090 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
200a0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
200b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
200c0 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
200d0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
200e0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
200f0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
20100 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
20110 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
20120 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
20130 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
20140 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
20150 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
20160 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20170 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
20180 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
20190 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
201a0 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
201b0 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
201c0 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
201d0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
201e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
201f0 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
20200 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
20210 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20220 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
20230 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
20240 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
20250 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
20260 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
20270 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
20280 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
20290 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
202a0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
202b0 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
202c0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
202d0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
202e0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
202f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
20300 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
20310 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
20320 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
20330 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
20340 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
20350 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
20360 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
20370 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
20380 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
20390 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
203a0 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
203b0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
203c0 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
203d0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
203e0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
203f0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20400 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
20410 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
20420 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
20430 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
20440 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
20450 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
20460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
20470 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
20480 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
20490 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
204a0 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
204b0 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
204c0 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
204d0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
204e0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
204f0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
20500 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
20510 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
20520 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
20530 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
20540 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
20550 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
20560 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
20570 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
20580 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
20590 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
205a0 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
205b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
205c0 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
205d0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
205e0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
205f0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
20600 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20620 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
20630 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
20640 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
20650 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
20660 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
20670 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
20680 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
20690 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
206a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
206b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
206c0 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
206d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
206e0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
206f0 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
20700 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
20710 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20720 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
20730 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
20740 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20750 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
20760 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
20770 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
20780 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
20790 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
207a0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
207b0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
207c0 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
207d0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
207e0 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
207f0 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
20800 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
20810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20820 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
20830 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
20840 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
20850 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
20860 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
20870 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
20880 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
20890 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
208a0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
208b0 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
208c0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
208d0 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
208e0 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
208f0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
20900 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
20910 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
20920 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
20930 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20940 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
20950 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
20960 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
20970 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
20980 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
20990 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
209a0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
209b0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
209c0 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
209d0 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
209e0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
209f0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
20a00 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
20a10 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
20a20 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
20a30 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
20a40 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
20a50 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
20a60 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
20a70 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
20a80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
20a90 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
20aa0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
20ab0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
20ac0 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
20ad0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
20ae0 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
20af0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20b00 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
20b10 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
20b20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
20b30 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
20b40 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
20b50 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
20b60 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
20b70 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
20b80 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
20b90 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
20ba0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
20bb0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
20bc0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
20bd0 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
20be0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
20bf0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
20c00 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
20c10 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
20c20 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
20c30 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
20c40 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
20c50 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20c60 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
20c70 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
20c80 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
20c90 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
20ca0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
20cb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20cc0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
20cd0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
20ce0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
20cf0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
20d00 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
20d10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
20d20 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
20d30 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
20d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20d50 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
20d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20d70 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
20d80 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
20d90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
20da0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
20db0 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
20dc0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
20dd0 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
20de0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20df0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
20e00 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
20e10 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
20e20 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
20e30 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
20e40 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
20e50 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
20e60 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
20e70 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
20e80 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
20e90 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
20ea0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
20eb0 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
20ec0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20ed0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
20ee0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
20ef0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
20f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20f10 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20f20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
20f30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20f40 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
20f50 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
20f60 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
20f70 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
20f80 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
20f90 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
20fa0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20fb0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
20fc0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
20fd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
20fe0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
20ff0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21000 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
21010 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
21020 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
21030 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
21040 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
21050 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
21060 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
21070 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
21080 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
21090 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
210a0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
210b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
210c0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
210d0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
210e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
210f0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
21100 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
21110 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21120 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
21130 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
21140 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
21150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21160 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
21170 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21180 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
21190 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
211a0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
211b0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
211c0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
211d0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
211e0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
211f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21200 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21210 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21220 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21230 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
21240 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
21250 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
21260 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
21270 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
21280 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
21290 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
212a0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
212b0 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
212c0 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
212d0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
212e0 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
212f0 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21300 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21310 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21320 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21330 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21340 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
21350 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
21360 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21370 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
21380 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
21390 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
213a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
213b0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
213c0 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
213d0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
213e0 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
213f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21400 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
21410 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
21420 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
21430 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
21440 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
21450 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
21460 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
21470 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
21480 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21490 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
214a0 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
214b0 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
214c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
214d0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
214e0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
214f0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
21500 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
21510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21520 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21530 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
21540 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21550 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21560 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21570 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
21580 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
21590 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
215a0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
215b0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
215c0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
215d0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
215e0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
215f0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
21600 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
21610 53 65 74 20 50 61 67 65 72 2e 6e 4d 61 70 4c 69  Set Pager.nMapLi
21620 6d 69 74 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d  mit, the maximum
21630 20 70 65 72 6d 69 74 74 65 64 20 6d 61 70 70 69   permitted mappi
21640 6e 67 20 73 69 7a 65 2c 20 62 61 73 65 64 20 6f  ng size, based o
21650 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
21660 20 76 61 6c 75 65 73 20 6f 66 20 50 61 67 65 72   values of Pager
21670 2e 6e 4d 61 70 43 66 67 4c 69 6d 69 74 20 61 6e  .nMapCfgLimit an
21680 64 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  d Pager.pageSize
21690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
216a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c  connection shoul
216b0 64 20 6e 6f 74 20 75 73 65 20 6d 6d 61 70 20 61  d not use mmap a
216c0 74 20 61 6c 6c 2c 20 73 65 74 20 6e 4d 61 70 4c  t all, set nMapL
216d0 69 6d 69 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f  imit to zero..*/
216e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
216f0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
21700 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21710 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
21720 72 2d 3e 66 64 29 3d 3d 30 20 0a 20 20 20 7c 7c  r->fd)==0 .   ||
21730 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
21740 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3c  thods->iVersion<
21750 33 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  3 .   || pPager-
21760 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  >fd->pMethods->x
21770 4d 72 65 6d 61 70 3d 3d 30 20 0a 20 20 20 7c 7c  Mremap==0 .   ||
21780 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21790 65 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  e .   || pPager-
217a0 3e 70 57 61 6c 20 0a 20 20 29 7b 0a 20 20 20 20  >pWal .  ){.    
217b0 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c 69 6d 69  pPager->nMapLimi
217c0 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
217d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 43  f( pPager->nMapC
217e0 66 67 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20  fgLimit<0 ){.   
217f0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c 69 6d   pPager->nMapLim
21800 69 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  it = (i64)pPager
21810 2d 3e 6e 4d 61 70 43 66 67 4c 69 6d 69 74 20 2a  ->nMapCfgLimit *
21820 20 2d 31 30 32 34 3b 0a 20 20 7d 65 6c 73 65 7b   -1024;.  }else{
21830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61  .    pPager->nMa
21840 70 4c 69 6d 69 74 20 3d 20 28 69 36 34 29 70 50  pLimit = (i64)pP
21850 61 67 65 72 2d 3e 6e 4d 61 70 43 66 67 4c 69 6d  ager->nMapCfgLim
21860 69 74 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  it * pPager->pag
21870 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eSize;.  }.}../*
21880 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21890 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
218a0 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ny memory mappin
218b0 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61  g made of the da
218c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
218d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
218e0 72 53 65 74 4d 6d 61 70 73 69 7a 65 28 50 61 67  rSetMmapsize(Pag
218f0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
21900 6e 4d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  nMap){.  pPager-
21910 3e 6e 4d 61 70 43 66 67 4c 69 6d 69 74 20 3d 20  >nMapCfgLimit = 
21920 6e 4d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78  nMap;.  pagerFix
21930 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
21940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
21950 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
21960 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
21970 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f  the pager..*/.vo
21980 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
21990 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61  hrink(Pager *pPa
219a0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
219b0 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67  cacheShrink(pPag
219c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
219d0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
219e0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
219f0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
21a00 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
21a10 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
21a20 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
21a30 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
21a40 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
21a50 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
21a60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
21a70 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
21a80 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
21a90 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
21aa0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
21ab0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
21ac0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
21ad0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
21ae0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
21af0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
21b00 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
21b10 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
21b20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
21b30 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
21b40 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
21b50 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
21b60 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
21b70 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
21b80 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
21b90 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
21ba0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
21bb0 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
21bc0 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
21bd0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
21bf0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
21c00 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
21c10 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
21c20 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
21c30 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
21c40 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
21c50 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
21c60 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
21c70 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
21c80 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
21c90 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
21ca0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
21cb0 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
21cc0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
21cd0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
21cf0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
21d00 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
21d10 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
21d20 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
21d30 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
21d40 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
21d50 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
21d60 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
21d70 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
21d80 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
21d90 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
21da0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
21db0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
21dc0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
21dd0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
21de0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
21e00 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
21e10 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
21e20 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
21e30 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
21e40 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
21e50 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
21e60 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
21e70 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
21e80 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73  .** The above is
21e90 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d   for a rollback-
21ea0 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46  journal mode.  F
21eb0 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46  or WAL mode, OFF
21ec0 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f   continues.** to
21ed0 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79   mean that no sy
21ee0 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20  ncs ever occur. 
21ef0 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68   NORMAL means th
21f00 61 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79  at the WAL is sy
21f10 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  nced.** prior to
21f20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68   the start of ch
21f30 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61  eckpoint and tha
21f40 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
21f50 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  ile is synced.**
21f60 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
21f70 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70  on of the checkp
21f80 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69  oint if the enti
21f90 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  re content of th
21fa0 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69  e WAL.** was wri
21fb0 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tten back into t
21fc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  he database.  Bu
21fd0 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74  t no sync operat
21fe0 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a  ions occur for.*
21ff0 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f  * an ordinary co
22000 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d  mmit in NORMAL m
22010 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46  ode with WAL.  F
22020 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ULL means that t
22030 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69  he WAL.** file i
22040 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  s synced followi
22050 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f  ng each commit o
22060 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64  peration, in add
22070 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  ition to the.** 
22080 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64  syncs associated
22090 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a   with NORMAL..**
220a0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75  .** Do not confu
220b0 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  se synchronous=F
220c0 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ULL with SQLITE_
220d0 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a  SYNC_FULL.  The.
220e0 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  ** SQLITE_SYNC_F
220f0 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20  ULL macro means 
22100 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53  to use the MacOS
22110 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79  X-style full-fsy
22120 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74  nc.** using fcnt
22130 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20  l(F_FULLFSYNC). 
22140 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
22150 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  MAL means to do 
22160 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66  an.** ordinary f
22170 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68  sync() call.  Th
22180 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
22190 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c  ence between SQL
221a0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a  ITE_SYNC_FULL.**
221b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43   and SQLITE_SYNC
221c0 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66  _NORMAL on platf
221d0 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20  orms other than 
221e0 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65  MacOSX.  But the
221f0 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  .** synchronous=
22200 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63  FULL versus sync
22210 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73  hronous=NORMAL s
22220 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65  etting determine
22230 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53  s when.** the xS
22240 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73  ync primitive is
22250 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72   called and is r
22260 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70  elevant to all p
22270 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20  latforms..**.** 
22280 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
22290 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
222a0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
222b0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
222c0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
222d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
222e0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
222f0 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
22300 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
22310 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72 20 2a  Level(.  Pager *
22320 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
22330 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73  * The pager to s
22340 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  et safety level 
22350 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76  for */.  int lev
22360 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  el,            /
22370 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
22380 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
22390 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
223a0 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c 6c 46  /  .  int bFullF
223b0 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a 20 50  sync,       /* P
223c0 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 20  RAGMA fullfsync 
223d0 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74 46 75  */.  int bCkptFu
223e0 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20 50 52  llFsync    /* PR
223f0 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
22400 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29 7b 0a  fullfsync */.){.
22410 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
22420 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
22430 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
22440 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
22450 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
22460 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
22470 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
22480 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
22490 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
224a0 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50 61 67  ?1:0;.  if( pPag
224b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
224c0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
224d0 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ags = 0;.    pPa
224e0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
224f0 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  gs = 0;.  }else 
22500 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63 20 29  if( bFullFsync )
22510 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22520 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22530 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
22540 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22550 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22560 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
22570 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c 6c 46  e if( bCkptFullF
22580 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  sync ){.    pPag
22590 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
225a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
225b0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
225c0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
225d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
225e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
225f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22600 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22610 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
22620 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22630 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22640 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
22650 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
22660 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
22670 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
22680 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
22690 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
226a0 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c  SyncFlags |= WAL
226b0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
226c0 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  NS;.  }.}.#endif
226d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
226e0 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
226f0 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
22700 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
22710 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
22720 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
22730 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
22740 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
22750 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
22760 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
22770 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
22780 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
22790 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
227a0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
227b0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
227c0 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
227d0 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
227e0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
227f0 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
22800 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
22810 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22820 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
22830 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
22840 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
22850 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
22860 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
22870 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
22880 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
22890 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
228a0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
228b0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
228c0 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
228d0 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
228e0 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
228f0 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
22900 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
22910 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
22920 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
22930 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22940 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
22950 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
22960 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
22970 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22980 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
22990 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
229a0 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
229b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
229c0 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
229d0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
229e0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
229f0 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
22a00 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
22a10 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
22a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
22a30 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
22a40 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
22a50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
22a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22a70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
22a80 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
22a90 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
22aa0 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
22ab0 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
22ac0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
22ad0 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
22ae0 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
22af0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22b00 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
22b10 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
22b20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22b30 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
22b40 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22b50 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
22b60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
22b70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
22b80 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
22b90 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
22ba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
22bb0 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
22bc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22bd0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
22be0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
22bf0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
22c00 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
22c10 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
22c20 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
22c30 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
22c40 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
22c50 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
22c60 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
22c70 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
22c80 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
22c90 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
22ca0 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
22cb0 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
22cc0 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
22cd0 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
22ce0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
22cf0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
22d00 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
22d10 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
22d20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
22d30 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
22d40 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
22d50 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
22d60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
22d70 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
22d80 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
22d90 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
22da0 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
22db0 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
22dc0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
22dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
22e00 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
22e10 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
22e20 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
22e30 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
22e40 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
22e50 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
22e60 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
22e70 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
22e80 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
22e90 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
22ea0 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
22eb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
22ec0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
22ed0 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
22ee0 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
22ef0 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
22f00 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
22f10 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
22f20 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
22f30 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
22f40 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
22f50 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
22f60 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
22f70 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
22f80 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
22f90 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fb0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
22fc0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
22fd0 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
22fe0 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
22ff0 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
23000 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
23010 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
23020 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
23030 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
23040 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
23050 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
23060 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
23070 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
23080 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
23090 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
230a0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
230b0 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
230c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
230d0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
230e0 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
230f0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
23100 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
23110 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
23120 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
23130 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
23140 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
23150 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
23160 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
23170 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
23180 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
23190 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
231a0 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
231b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
231c0 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
231d0 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
231e0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
231f0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
23200 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
23210 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23220 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
23230 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
23240 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
23250 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
23260 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
23270 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
23280 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
23290 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
232a0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
232b0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
232c0 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
232d0 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
232e0 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
232f0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
23300 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
23310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
23320 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
23330 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
23340 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
23350 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
23360 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
23370 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
23380 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
23390 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
233a0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
233b0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
233c0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
233d0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
233e0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
233f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
23400 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
23410 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23420 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
23430 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
23440 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
23450 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
23460 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
23470 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
23480 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
23490 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
234a0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
234b0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
234c0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
234d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
234e0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
234f0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
23500 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
23510 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
23520 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
23530 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
23540 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
23550 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
23560 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
23570 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
23580 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
23590 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
235a0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
235b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
235c0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
235d0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
235e0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
235f0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
23600 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
23610 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
23620 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
23630 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
23640 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
23650 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
23660 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
23670 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
23680 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
23690 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
236a0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
236b0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
236c0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
236d0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
236e0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
236f0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
23700 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
23710 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
23720 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
23730 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23740 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
23750 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
23760 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
23770 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
23780 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
23790 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
237a0 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
237b0 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
237c0 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
237d0 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
237e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
237f0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
23800 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
23810 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
23820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
23830 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
23840 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
23850 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
23860 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
23870 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
23880 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
23890 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
238a0 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
238b0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
238c0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
238d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
238e0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
238f0 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
23900 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
23910 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
23920 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
23930 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
23940 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
23950 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
23960 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
23970 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
23980 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
23990 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
239a0 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
239b0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
239c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
239d0 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
239e0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
239f0 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
23a00 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
23a10 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
23a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23a30 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
23a40 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
23a50 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
23a60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
23a70 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
23a80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
23a90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23aa0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
23ab0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
23ac0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
23ad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23ae0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
23af0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
23b00 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
23b10 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
23b20 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
23b30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
23b40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23b60 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
23b70 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
23b80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
23b90 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
23ba0 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
23bb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23bc0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
23bd0 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
23be0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
23bf0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
23c00 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
23c10 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
23c20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
23c30 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
23c40 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
23c50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
23c60 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
23c70 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
23c80 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
23c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ca0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
23cb0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
23cc0 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
23cd0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
23ce0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
23cf0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
23d00 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
23d10 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
23d20 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
23d30 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
23d40 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
23d50 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
23d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23d70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
23d80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
23d90 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
23da0 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
23db0 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
23dc0 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
23dd0 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
23de0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
23df0 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
23e00 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
23e10 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
23e20 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
23e30 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
23e40 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
23e50 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
23e60 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
23e70 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
23e80 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
23e90 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
23ea0 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
23eb0 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
23ec0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
23ed0 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
23ee0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
23ef0 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
23f00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
23f10 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
23f20 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
23f30 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
23f40 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
23f50 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
23f60 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
23f70 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
23f80 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
23f90 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
23fa0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
23fb0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
23fc0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
23fd0 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
23fe0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
23ff0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
24000 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
24010 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
24020 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
24030 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
24040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24050 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
24060 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24070 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
24080 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
24090 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
240a0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
240b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
240c0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
240d0 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
240e0 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
240f0 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
24100 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
24110 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
24120 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
24130 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
24140 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
24150 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
24160 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
24170 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
24180 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
24190 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
241a0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
241b0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
241c0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
241d0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
241e0 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
241f0 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
24200 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
24210 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
24220 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
24230 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
24240 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
24250 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
24260 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
24270 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
24280 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
24290 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
242a0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
242b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
242c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
242d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
242e0 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
242f0 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
24300 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24310 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
24320 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
24330 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24340 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
24350 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24360 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
24370 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24380 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24390 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
243a0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
243b0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
243c0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
243d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
243e0 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
243f0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
24400 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
24410 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
24420 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
24430 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
24440 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
24450 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
24460 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
24470 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
24480 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
24490 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
244a0 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
244b0 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
244c0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
244d0 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
244e0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
244f0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
24500 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
24510 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24520 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
24530 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
24540 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
24550 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
24560 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
24570 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
24580 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
24590 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
245a0 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
245b0 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
245c0 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
245d0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
245e0 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
245f0 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
24600 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
24610 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
24620 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
24630 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
24640 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
24650 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
24660 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
24670 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
24680 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
24690 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
246a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
246b0 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
246c0 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
246d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
246e0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
246f0 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
24700 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24710 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
24720 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
24730 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
24740 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
24750 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
24760 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
24770 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
24780 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
24790 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
247a0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
247b0 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
247c0 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
247d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
247e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
247f0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
24800 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24810 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
24820 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
24830 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
24840 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24850 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
24860 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
24870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24880 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
24890 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
248a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
248b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
248c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
248d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
248e0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
248f0 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
24900 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
24910 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
24920 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
24930 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
24940 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
24950 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
24960 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
24970 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
24980 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
24990 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
249a0 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
249b0 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
249c0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
249d0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
249e0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
249f0 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
24a00 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
24a10 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
24a20 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
24a30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
24a40 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
24a50 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
24a60 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
24a70 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
24a80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
24a90 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
24aa0 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
24ab0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24ac0 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
24ad0 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
24ae0 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
24af0 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
24b00 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
24b10 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
24b20 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
24b30 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
24b40 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
24b50 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
24b60 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
24b70 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
24b80 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
24b90 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
24ba0 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
24bb0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
24bc0 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
24bd0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
24be0 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
24bf0 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
24c00 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
24c10 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
24c20 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
24c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
24c40 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
24c50 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
24c60 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
24c70 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
24c80 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
24c90 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
24ca0 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
24cb0 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
24cc0 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
24cd0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
24ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
24cf0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
24d00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24d10 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
24d20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
24d50 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
24d60 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
24d70 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
24d80 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
24d90 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
24da0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
24db0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
24dc0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
24dd0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
24de0 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
24df0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
24e00 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
24e10 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
24e20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
24e30 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
24e40 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24e50 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
24e60 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
24e70 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
24e80 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
24e90 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
24ea0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
24eb0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
24ec0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
24ed0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
24ee0 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
24ef0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
24f00 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
24f10 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
24f20 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
24f30 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
24f40 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24f50 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
24f60 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
24f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24f80 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
24f90 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
24fa0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
24fb0 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
24fc0 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
24fd0 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
24fe0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
24ff0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
25000 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
25010 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
25020 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
25030 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
25040 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
25050 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
25060 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
25070 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
25080 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
25090 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
250a0 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
250b0 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
250c0 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
250d0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
250e0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
250f0 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
25100 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
25110 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
25120 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
25130 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
25140 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
25150 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
25160 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
25170 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
25180 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
25190 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
251a0 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
251b0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
251c0 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
251d0 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
251e0 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
251f0 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
25200 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
25210 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
25220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25230 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
25240 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
25250 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
25260 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
25270 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
25280 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
25290 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
252a0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
252b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
252c0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
252d0 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
252e0 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
252f0 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
25300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
25310 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
25320 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
25330 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
25340 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
25350 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
25360 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
25370 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
25380 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
25390 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
253a0 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
253b0 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
253c0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
253d0 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
253e0 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
253f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
25400 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
25410 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
25420 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
25430 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
25440 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
25450 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
25460 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
25470 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
25480 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
25490 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
254a0 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
254b0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
254c0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
254d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
254e0 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
254f0 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
25500 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
25510 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25520 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
25530 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
25540 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25550 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
25560 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
25570 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
25580 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
25590 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
255a0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
255b0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
255c0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
255d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
255e0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
255f0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
25600 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
25610 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
25620 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
25630 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
25640 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
25650 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
25660 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
25670 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
25680 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
25690 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
256a0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
256b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
256c0 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
256d0 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
256e0 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
256f0 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
25700 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
25710 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
25720 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
25730 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
25740 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
25750 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
25760 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
25770 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
25780 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
25790 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
257a0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
257b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
257c0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
257d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
257e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
257f0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
25800 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
25810 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
25820 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
25830 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
25840 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
25850 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25860 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
25870 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
25880 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
25890 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
258a0 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
258b0 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
258c0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
258d0 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
258e0 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
258f0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
25900 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
25910 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
25920 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
25930 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
25940 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
25950 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
25960 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25970 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
25980 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
25990 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
259a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
259b0 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
259c0 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
259d0 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
259e0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
259f0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
25a00 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
25a10 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
25a20 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
25a30 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25a40 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
25a50 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
25a60 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
25a70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25a80 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
25a90 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
25aa0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
25ab0 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
25ac0 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
25ad0 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
25ae0 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
25af0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
25b00 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
25b10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
25b20 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
25b30 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
25b40 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
25b50 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
25b60 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
25b70 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
25b80 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
25b90 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
25ba0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
25bb0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
25bc0 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
25bd0 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
25be0 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
25bf0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
25c00 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
25c10 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
25c20 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
25c30 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
25c40 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
25c50 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
25c60 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
25c70 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
25c80 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
25c90 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
25ca0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
25cb0 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
25cc0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25cd0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
25ce0 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
25cf0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
25d00 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
25d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
25d20 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
25d30 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
25d40 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
25d50 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
25d60 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
25d70 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
25d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
25d90 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
25da0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
25db0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
25dc0 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
25dd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25de0 20 55 6e 6d 61 70 20 61 6e 79 20 6d 65 6d 6f 72   Unmap any memor
25df0 79 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65  y mapping of the
25e00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
25e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
25e20 67 65 72 55 6e 6d 61 70 28 50 61 67 65 72 20 2a  gerUnmap(Pager *
25e30 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
25e40 50 61 67 65 72 2d 3e 70 4d 61 70 20 29 7b 0a 20  Pager->pMap ){. 
25e50 20 20 20 73 71 6c 69 74 65 33 4f 73 4d 72 65 6d     sqlite3OsMrem
25e60 61 70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ap(pPager->fd, 0
25e70 2c 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 2c 20  , pPager->nMap, 
25e80 30 2c 20 26 70 50 61 67 65 72 2d 3e 70 4d 61 70  0, &pPager->pMap
25e90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
25ea0 4d 61 70 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Map = 0;.    pPa
25eb0 67 65 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d  ger->nMapValid =
25ec0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25ee0 2a 0a 2a 2a 20 43 72 65 61 74 65 2c 20 6f 72 20  *.** Create, or 
25ef0 72 65 63 72 65 61 74 65 2c 20 74 68 65 20 6d 65  recreate, the me
25f00 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6f 66 20  mory mapping of 
25f10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25f20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25f30 20 70 61 67 65 72 4d 61 70 28 50 61 67 65 72 20   pagerMap(Pager 
25f40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
25f50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25f70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
25f80 50 67 6e 6f 20 6e 50 67 3b 20 20 20 20 20 20 20  Pgno nPg;       
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 70 70 69  /* Size of mappi
25fb0 6e 67 20 74 6f 20 72 65 71 75 65 73 74 20 69 6e  ng to request in
25fc0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34 20   pages */.  i64 
25fd0 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25ff0 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 74  ize of mapping t
26000 6f 20 72 65 71 75 65 73 74 20 69 6e 20 62 79 74  o request in byt
26010 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
26020 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
26030 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
26040 72 2d 3e 66 64 29 20 26 26 20 70 50 61 67 65 72  r->fd) && pPager
26050 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b  ->tempFile==0 );
26060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26070 72 2d 3e 70 4d 61 70 3d 3d 30 20 7c 7c 20 70 50  r->pMap==0 || pP
26080 61 67 65 72 2d 3e 6e 4d 61 70 3e 30 20 29 3b 0a  ager->nMap>0 );.
26090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
260a0 2d 3e 65 53 74 61 74 65 3e 3d 31 20 29 3b 0a 20  ->eState>=1 );. 
260b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
260c0 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 0a  >nMmapOut==0 );.
260d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
260e0 2d 3e 6e 4d 61 70 4c 69 6d 69 74 3e 30 20 29 3b  ->nMapLimit>0 );
260f0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
26100 74 20 68 6f 77 20 6c 61 72 67 65 20 61 20 6d 61  t how large a ma
26110 70 70 69 6e 67 20 74 6f 20 72 65 71 75 65 73 74  pping to request
26120 2e 20 53 65 74 20 76 61 72 69 61 62 6c 65 20 73  . Set variable s
26130 7a 20 74 6f 20 74 68 69 73 20 0a 20 20 2a 2a 20  z to this .  ** 
26140 76 61 6c 75 65 20 69 6e 20 62 79 74 65 73 2e 20  value in bytes. 
26150 2a 2f 0a 20 20 6e 50 67 20 3d 20 28 70 50 61 67  */.  nPg = (pPag
26160 65 72 2d 3e 65 53 74 61 74 65 3d 3d 31 29 20 3f  er->eState==1) ?
26170 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
26180 3a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  : pPager->dbFile
26190 53 69 7a 65 3b 0a 20 20 73 7a 20 3d 20 28 69 36  Size;.  sz = (i6
261a0 34 29 6e 50 67 20 2a 20 70 50 61 67 65 72 2d 3e  4)nPg * pPager->
261b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
261c0 73 7a 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c  sz>pPager->nMapL
261d0 69 6d 69 74 20 29 20 73 7a 20 3d 20 70 50 61 67  imit ) sz = pPag
261e0 65 72 2d 3e 6e 4d 61 70 4c 69 6d 69 74 3b 0a 0a  er->nMapLimit;..
261f0 20 20 69 66 28 20 73 7a 21 3d 70 50 61 67 65 72    if( sz!=pPager
26200 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 29 7b 0a 20  ->nMapValid ){. 
26210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26220 73 4d 72 65 6d 61 70 28 70 50 61 67 65 72 2d 3e  sMremap(pPager->
26230 66 64 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  fd, 0, pPager->n
26240 4d 61 70 2c 20 73 7a 2c 20 26 70 50 61 67 65 72  Map, sz, &pPager
26250 2d 3e 70 4d 61 70 29 3b 0a 20 20 20 20 69 66 28  ->pMap);.    if(
26260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26270 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
26280 70 50 61 67 65 72 2d 3e 70 4d 61 70 21 3d 30 20  pPager->pMap!=0 
26290 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
262a0 3e 6e 4d 61 70 20 3d 20 73 7a 3b 0a 20 20 20 20  >nMap = sz;.    
262b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
262c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4d 61  ert( pPager->pMa
262d0 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  p==0 );.      pP
262e0 61 67 65 72 2d 3e 6e 4d 61 70 20 3d 20 30 3b 0a  ager->nMap = 0;.
262f0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
26300 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d 20 70 50  ->nMapValid = pP
26310 61 67 65 72 2d 3e 6e 4d 61 70 3b 0a 20 20 7d 0a  ager->nMap;.  }.
26320 20 20 70 50 61 67 65 72 2d 3e 62 4d 61 70 52 65    pPager->bMapRe
26330 73 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 72 65 74  size = 0;..  ret
26340 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26350 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
26360 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20  nce to a memory 
26370 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65  mapped page obje
26380 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ct for page numb
26390 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65  er pgno. .** The
263a0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
263b0 75 72 65 20 74 68 61 74 20 70 61 67 65 20 70 67  ure that page pg
263c0 6e 6f 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  no lies within t
263d0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 70  he currently map
263e0 70 65 64 20 0a 2a 2a 20 72 65 67 69 6f 6e 2e 20  ped .** region. 
263f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
26400 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
26410 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
26420 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
26430 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
26440 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
26450 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
26460 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
26470 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
26480 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
26490 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
264a0 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
264b0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
264c0 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
264d0 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
264e0 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
264f0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
26500 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
26510 75 69 72 65 4d 61 70 50 61 67 65 28 50 61 67 65  uireMapPage(Page
26520 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
26530 70 67 6e 6f 2c 20 50 67 48 64 72 20 2a 2a 70 70  pgno, PgHdr **pp
26540 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
26550 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
26560 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
26570 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 74  ry mapped page t
26580 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69  o return */..  i
26590 66 28 20 70 50 61 67 65 72 2d 3e 70 46 72 65 65  f( pPager->pFree
265a0 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
265b0 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  = p = pPager->pF
265c0 72 65 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ree;.    pPager-
265d0 3e 70 46 72 65 65 20 3d 20 70 2d 3e 70 44 69 72  >pFree = p->pDir
265e0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
265f0 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65  y = 0;.    memse
26600 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20  t(p->pExtra, 0, 
26610 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
26620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
26630 70 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48  pPage = p = (PgH
26640 64 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  dr *)sqlite3Mall
26650 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
26660 48 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Hdr) + pPager->n
26670 45 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20  Extra);.    if( 
26680 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  p==0 ){.      re
26690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
266a0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  M;.    }.    p->
266b0 70 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a  pExtra = (void *
266c0 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66  )&p[1];.    p->f
266d0 6c 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41  lags = PGHDR_MMA
266e0 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  P;.    p->nRef =
266f0 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65   1;.    p->pPage
26700 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a  r = pPager;.  }.
26710 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
26720 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70  xtra==(void *)&p
26730 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  [1] );.  assert(
26740 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a   p->pPage==0 );.
26750 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61    assert( p->fla
26760 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29  gs==PGHDR_MMAP )
26770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
26780 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
26790 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
267a0 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70  ef==1 );..  p->p
267b0 44 61 74 61 20 3d 20 26 28 28 75 38 20 2a 29 70  Data = &((u8 *)p
267c0 50 61 67 65 72 2d 3e 70 4d 61 70 29 5b 28 69 36  Pager->pMap)[(i6
267d0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
267e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  ger->pageSize];.
267f0 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f    p->pgno = pgno
26800 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
26810 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72  pOut++;..  retur
26820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
26830 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
26840 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
26850 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20  e pPg. pPg must 
26860 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e  have been return
26870 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72  ed by an .** ear
26880 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67  lier call to pag
26890 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
268a0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
268b0 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  id pagerReleaseM
268c0 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  apPage(PgHdr *pP
268d0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
268e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
268f0 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  r;.  pPager->nMm
26900 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e  apOut--;.  pPg->
26910 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
26920 3e 70 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72  >pFree;.  pPager
26930 2d 3e 70 46 72 65 65 20 3d 20 70 50 67 3b 0a 7d  ->pFree = pPg;.}
26940 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
26950 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
26960 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
26970 65 72 2e 70 46 72 65 65 20 6c 69 73 74 2e 0a 2a  er.pFree list..*
26980 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26990 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
269a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
269b0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
269c0 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
269d0 28 70 3d 70 50 61 67 65 72 2d 3e 70 46 72 65 65  (p=pPager->pFree
269e0 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
269f0 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
26a00 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
26a10 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
26a20 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
26a30 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
26a40 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
26a50 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
26a60 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
26a70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
26a80 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
26a90 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26aa0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
26ab0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
26ac0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
26ad0 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
26ae0 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
26af0 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
26b00 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
26b10 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
26b20 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
26b30 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
26b40 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
26b50 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
26b60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
26b70 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
26b80 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
26b90 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
26ba0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
26bb0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
26bc0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
26bd0 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
26be0 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
26bf0 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
26c00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
26c10 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
26c20 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
26c30 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
26c40 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
26c50 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
26c60 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
26c70 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
26c80 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
26c90 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
26ca0 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70  ger){.  u8 *pTmp
26cb0 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
26cc0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61  >pTmpSpace;..  a
26cd0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
26ce0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
26cf0 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
26d00 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
26d10 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
26d20 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
26d30 28 29 3b 0a 20 20 70 61 67 65 72 55 6e 6d 61 70  ();.  pagerUnmap
26d40 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
26d50 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50 61  rFreeMapHdrs(pPa
26d60 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ger);.  /* pPage
26d70 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20  r->errCode = 0; 
26d80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  */.  pPager->exc
26d90 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
26da0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26db0 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65  MIT_WAL.  sqlite
26dc0 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
26dd0 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ->pWal, pPager->
26de0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20 70  ckptSyncFlags, p
26df0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
26e00 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65 72   pTmp);.  pPager
26e10 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64  ->pWal = 0;.#end
26e20 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  if.  pager_reset
26e30 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
26e40 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
26e50 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
26e60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26e70 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e  /* If it is open
26e80 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
26e90 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  al file before c
26ea0 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64  alling UnlockAnd
26eb0 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a  Rollback..    **
26ec0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
26ed0 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e  done, then an un
26ee0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
26ef0 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
26f00 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  al .    ** file 
26f10 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61  may be played ba
26f20 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
26f30 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
26f40 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
26f50 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68  .    ** while th
26f60 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c  is is happening,
26f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
26f80 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  uld become corru
26f90 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  pt..    **.    *
26fa0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
26fb0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
26fc0 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f  g to sync the jo
26fd0 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65  urnal, shift the
26fe0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e   pager.    ** in
26ff0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
27000 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  te. This causes 
27010 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
27020 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  k to unlock the.
27030 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27040 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f  and close the jo
27050 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f  urnal file witho
27060 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ut attempting to
27070 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20   roll it.    ** 
27080 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65  back or finalize
27090 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61   it. The next da
270a0 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c  tabase user will
270b0 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d   have to do hot-
270c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72  journal.    ** r
270d0 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61  ollback before a
270e0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
270f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
27100 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  */.    if( isOpe
27110 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
27120 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
27130 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65  ror(pPager, page
27140 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
27150 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
27160 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
27170 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
27180 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
27190 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
271a0 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
271b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
271c0 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
271d0 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
271e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
271f0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
27200 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
27210 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
27220 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
27230 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  d);.  sqlite3OsC
27240 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
27250 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
27260 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c  ree(pTmp);.  sql
27270 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
27280 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
27290 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
272a0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
272b0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
272c0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
272d0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
272e0 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66  >pCodec);.#endif
272f0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
27300 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
27310 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
27320 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
27330 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
27340 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
27350 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
27360 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
27370 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
27380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27390 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
273a0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
273b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
273c0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
273d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
273e0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
273f0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
27400 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
27410 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
27420 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
27430 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
27440 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
27450 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
27460 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
27470 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
27480 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
27490 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
274a0 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
274b0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
274c0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
274d0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
274e0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
274f0 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
27500 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
27510 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
27520 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
27530 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
27540 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
27550 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
27560 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
27570 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
27580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
27590 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
275a0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
275b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
275c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72   no-op..** Other
275d0 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
275e0 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
275f0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
27600 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a  -mode and the .*
27610 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  * device charact
27620 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
27630 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
27640 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
27650 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
27660 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
27670 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
27680 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
27690 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
276a0 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
276b0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
276c0 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
276d0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
276e0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
276f0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
27700 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
27710 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
27720 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
27730 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
27740 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
27750 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
27760 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
27770 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
27780 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
27790 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
277a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
277b0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
277c0 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
277d0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
277e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
277f0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
27800 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
27810 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
27820 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27830 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27840 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
27850 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
27860 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
27870 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
27880 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
27890 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
278a0 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
278b0 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
278c0 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
278d0 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
278e0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
278f0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
27900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
27910 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
27920 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
27930 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
27940 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
27950 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
27960 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
27970 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
27980 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
27990 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
279a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
279b0 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
279c0 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
279d0 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
279e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
279f0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
27a00 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
27a10 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
27a20 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
27a30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
27a40 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
27a50 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
27a60 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
27a70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64  Pager, int newHd
27a80 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27aa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27ab0 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
27ac0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
27ad0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
27ae0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
27af0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
27b00 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
27b10 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
27b20 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27b30 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
27b50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
27b60 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ) );..  rc = sql
27b70 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
27b80 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
27b90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27ba0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
27bb0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
27bc0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
27bd0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
27be0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
27bf0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
27c00 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
27c10 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
27c20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
27c30 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
27c40 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
27c50 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
27c60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
27c70 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
27c80 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
27c90 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
27ca0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
27cb0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
27cc0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
27cd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27ce0 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
27cf0 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
27d00 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
27d10 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
27d20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
27d30 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
27d40 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
27d50 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
27d60 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
27d70 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
27d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27d90 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
27da0 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
27db0 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
27dc0 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
27dd0 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
27de0 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
27df0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
27e00 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
27e10 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
27e20 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
27e30 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
27e40 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
27e50 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
27e60 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69  tion's transacti
27e70 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68  on), and a crash
27e80 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72   or power-failur
27e90 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63  e .        ** oc
27ea0 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20  curs after nRec 
27eb0 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62  is updated but b
27ec0 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65  efore this conne
27ed0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20  ction writes .  
27ee0 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e        ** anythin
27ef0 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f  g else to the jo
27f00 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63  urnal file (or c
27f10 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63  ommits/rolls bac
27f20 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a  k its .        *
27f30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  * transaction), 
27f40 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20  then SQLite may 
27f50 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20  become confused 
27f60 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a  when doing the .
27f70 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a          ** hot-j
27f80 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
27f90 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65  following recove
27fa0 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20  ry. It may roll 
27fb0 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20  back all.       
27fc0 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   ** of this conn
27fd0 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68  ections data, th
27fe0 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f  en proceed to ro
27ff0 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f  lling back the o
28000 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ld,.        ** o
28010 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20  ut-of-date data 
28020 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e  that follows it.
28030 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
28040 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
28050 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77  .        ** To w
28060 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c  ork around this,
28070 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
28080 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72  file does appear
28090 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20   to contain.    
280a0 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68      ** a valid h
280b0 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  eader following 
280c0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
280d0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30  , then write a 0
280e0 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  x00.        ** b
280f0 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74  yte to the start
28100 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e   of it to preven
28110 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20  t it from being 
28120 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20  recognized..    
28130 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28140 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74  * Variable iNext
28150 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
28160 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61   to the offset a
28170 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20  t which this.   
28180 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61       ** problema
28190 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20  tic header will 
281a0 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69  occur, if it exi
281b0 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75  sts. aMagic is u
281c0 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  sed .        ** 
281d0 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  as a temporary b
281e0 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74  uffer to inspect
281f0 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c   the first coupl
28200 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20  e of bytes of.  
28210 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74        ** the pot
28220 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68  ential journal h
28230 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a  eader..        *
28240 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
28250 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20  extHdrOffset;.  
28260 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
28270 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a  8];.        u8 z
28280 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
28290 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
282a0 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ..        memcpy
282b0 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
282c0 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
282d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
282e0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
282f0 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
28300 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28310 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  )], pPager->nRec
28320 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78  );..        iNex
28330 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75  tHdrOffset = jou
28340 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
28350 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72  ager);.        r
28360 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
28370 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
28380 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
28390 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
283a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
283b0 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
283c0 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
283d0 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
283e0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
283f0 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
28400 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
28410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
28420 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
28430 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
28440 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
28450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28470 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
28480 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
28490 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
284a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
284b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
284c0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
284d0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
284e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
284f0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
28500 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
28510 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
28520 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
28530 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
28540 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
28550 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
28560 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
28570 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
28580 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
28590 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
285a0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
285b0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
285c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
285d0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
285e0 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
285f0 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
28600 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
28610 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
28620 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
28630 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
28640 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
28650 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
28660 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
28670 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
28680 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
28690 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
286a0 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
286b0 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
286c0 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
286d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
286e0 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
286f0 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
28700 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
28710 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
28720 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
28730 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
28740 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28750 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
28760 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
28770 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
28780 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
28790 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
287a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
287b0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
287c0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
287d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
287e0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
287f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
28800 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  yncFlags);.     
28810 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28820 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28830 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
28840 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28850 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
28860 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
28870 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
28880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28890 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
288a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
288b0 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
288c0 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
288d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
288e0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
288f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28900 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28910 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
28920 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
28930 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
28940 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
28950 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28960 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28970 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28980 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28990 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
289a0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
289b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
289c0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
289d0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
289e0 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20  >syncFlags| .   
289f0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
28a00 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54  syncFlags==SQLIT
28a10 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
28a20 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
28a30 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
28a40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28a50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28a60 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
28a70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28a80 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
28a90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
28aa0 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26      if( newHdr &
28ab0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
28ac0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
28ad0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ND) ){.        p
28ae0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
28af0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
28b00 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
28b10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
28b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28b30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28b40 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28b50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28b60 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
28b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
28b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
28b90 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
28ba0 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f   is in noSync mo
28bb0 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
28bc0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20  file was just . 
28bd0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79   ** successfully
28be0 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20   synced. Either 
28bf0 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50  way, clear the P
28c00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
28c10 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c  lag on .  ** all
28c20 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73   pages..  */.  s
28c30 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
28c40 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
28c50 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70  r->pPCache);.  p
28c60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
28c70 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
28c80 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73  OD;.  assert( as
28c90 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
28ca0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
28cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
28cd0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
28ce0 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
28cf0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
28d00 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
28d10 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
28d20 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
28d30 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
28d40 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
28d50 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
28d60 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
28d70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28d80 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
28d90 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
28da0 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
28db0 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
28dc0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
28dd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
28de0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
28df0 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
28e00 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
28e10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
28e20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
28e30 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
28e40 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
28e50 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
28e60 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
28e70 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
28e80 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
28e90 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
28ea0 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
28eb0 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
28ec0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
28ed0 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
28ee0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
28ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f00 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
28f10 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
28f20 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
28f30 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
28f40 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
28f50 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
28f60 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
28f70 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
28f80 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
28f90 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
28fa0 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
28fb0 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
28fc0 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
28fd0 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
28fe0 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
28ff0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
29000 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29010 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
29020 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
29030 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
29040 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
29050 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
29060 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
29070 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
29080 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
29090 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
290a0 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
290b0 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
290c0 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
290d0 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
290e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
290f0 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
29100 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
29110 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
29120 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
29130 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
29140 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
29150 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
29160 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
29170 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
29180 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
29190 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
291a0 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
291b0 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
291c0 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
291d0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
291e0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
291f0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
29200 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
29210 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
29220 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
29230 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
29240 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
29250 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
29260 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
29270 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
29280 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
29290 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
292a0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
292b0 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70  agelist(Pager *p
292c0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c  Pager, PgHdr *pL
292d0 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ist){.  int rc =
292e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29300 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
29310 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
29320 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  on is only calle
29330 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70  d for rollback p
29340 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f  agers in WRITER_
29350 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a  DBMOD state. */.
29360 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
29370 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
29380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29390 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
293a0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
293b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
293c0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
293d0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
293e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
293f0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
29400 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
29410 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
29420 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
29430 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
29440 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
29450 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
29460 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
29470 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
29480 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
29490 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
294a0 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
294b0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
294c0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
294d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
294e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
294f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29500 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
29510 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
29520 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
29530 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
29540 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
29550 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
29560 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
29570 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
29580 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
29590 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
295a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
295b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
295c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
295d0 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
295e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
295f0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61 67  ger->dbSize>pPag
29600 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
29610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
29620 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
29630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
29640 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
29650 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29660 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
29670 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
29680 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
29690 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
296a0 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
296b0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
296c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
296d0 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
296e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
296f0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
29700 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
29710 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
29720 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
29730 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
29740 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
29750 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
29760 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
29770 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
29780 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
29790 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
297a0 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
297b0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
297c0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
297d0 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
297e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
297f0 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
29800 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
29810 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
29820 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
29830 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
29840 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
29850 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
29860 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29870 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
29880 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
29890 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
298a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
298b0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
298c0 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
298d0 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
298e0 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
298f0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
29900 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
29910 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
29920 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29930 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
29940 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
29950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29970 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
29980 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
29990 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
299a0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
299b0 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
299c0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
299d0 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
299e0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
299f0 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
29a00 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
29a10 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
29a20 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
29a30 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
29a40 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
29a50 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
29a60 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
29a70 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
29a80 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ta. */.      if(
29a90 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 56 61 6c   pPager->nMapVal
29aa0 69 64 3e 3d 28 6f 66 66 73 65 74 2b 70 50 61 67  id>=(offset+pPag
29ab0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
29ac0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
29ad0 26 28 28 75 38 20 2a 29 28 70 50 61 67 65 72 2d  &((u8 *)(pPager-
29ae0 3e 70 4d 61 70 29 29 5b 6f 66 66 73 65 74 5d 2c  >pMap))[offset],
29af0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
29b00 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
29b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29b20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29b30 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
29b40 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
29b50 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
29b60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
29b70 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
29b80 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
29b90 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
29ba0 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
29bb0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
29bc0 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
29bd0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
29be0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
29bf0 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
29c00 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
29c10 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29c20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
29c30 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
29c40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
29c50 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
29c60 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
29c70 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
29c80 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
29c90 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
29ca0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
29cb0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
29cc0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
29cd0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
29ce0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
29cf0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
29d00 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
29d10 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
29d20 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
29d30 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
29d40 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
29d50 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
29d60 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
29d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
29d80 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
29d90 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
29da0 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
29db0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
29dc0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
29dd0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
29de0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
29e00 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
29e10 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
29e20 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
29e30 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
29e40 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
29e50 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
29e60 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
29e70 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
29e80 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
29e90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
29ea0 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
29eb0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
29ec0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29ed0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
29ee0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
29ef0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
29f00 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
29f10 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
29f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29f30 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
29f40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29f50 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
29f60 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
29f70 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
29f80 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
29f90 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
29fa0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29fb0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
29fc0 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
29fd0 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
29fe0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
29ff0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2a000 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2a010 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2a020 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2a030 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2a040 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2a050 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2a060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a070 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2a080 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2a090 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2a0a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2a0b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2a0c0 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2a0d0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2a0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
2a0f0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2a100 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
2a110 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2a120 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
2a130 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2a140 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
2a150 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
2a160 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a170 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
2a180 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
2a190 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2a1a0 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
2a1b0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2a1c0 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
2a1d0 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
2a1e0 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
2a1f0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
2a200 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
2a210 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
2a220 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
2a230 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
2a240 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
2a250 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
2a260 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
2a270 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
2a280 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
2a290 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
2a2a0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
2a2b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2a2c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2a2d0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2a2e0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2a2f0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2a300 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
2a310 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
2a320 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
2a330 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2a340 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2a350 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2a360 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
2a370 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
2a380 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
2a390 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
2a3a0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2a3b0 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
2a3c0 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
2a3d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
2a3e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2a3f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2a400 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2a410 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2a420 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
2a430 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2a440 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2a450 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
2a460 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
2a470 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2a480 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2a490 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
2a4a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a4b0 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
2a4c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2a4d0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2a4e0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2a4f0 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
2a500 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
2a510 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
2a520 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
2a530 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
2a540 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20  nal(pPg) .      
2a550 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2a560 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2a570 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2a580 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2a590 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2a5a0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2a5b0 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2a5c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2a5d0 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2a5e0 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2a5f0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2a600 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2a610 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2a620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a630 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2a640 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2a650 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2a660 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2a670 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2a680 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2a690 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2a6a0 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44  a2;.  .      COD
2a6b0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
2a6c0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
2a6d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2a6e0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
2a6f0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a700 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
2a710 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2a720 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2a730 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2a740 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
2a750 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
2a760 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
2a770 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2a780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a790 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a7a0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2a7b0 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32  er->sjfd, pData2
2a7c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2a7d0 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20  ze, offset+4);. 
2a7e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a7f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a800 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
2a810 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
2a820 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a830 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
2a840 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
2a850 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
2a860 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
2a870 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2a880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a8a0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2a8b0 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
2a8c0 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
2a8d0 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
2a8e0 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
2a8f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
2a900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2a910 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
2a920 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
2a930 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
2a940 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
2a950 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
2a960 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
2a970 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
2a980 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
2a990 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
2a9a0 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
2a9b0 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
2a9c0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
2a9d0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
2a9e0 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
2a9f0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
2aa00 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
2aa10 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
2aa20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
2aa30 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
2aa40 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
2aa50 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
2aa60 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
2aa70 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
2aa80 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
2aa90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2aaa0 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
2aab0 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
2aac0 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
2aad0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
2aae0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2aaf0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
2ab00 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
2ab10 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
2ab20 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
2ab30 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2ab40 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2ab50 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2ab60 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
2ab70 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
2ab80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ab90 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
2aba0 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
2abb0 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
2abc0 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
2abd0 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
2abe0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2abf0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2ac00 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2ac10 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2ac20 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2ac30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ac40 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
2ac50 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
2ac60 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2ac70 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
2ac80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ac90 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2aca0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
2acb0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
2acc0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2acd0 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
2ace0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53  * The doNotSyncS
2acf0 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65 74  pill flag is set
2ad00 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2ad10 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2ad20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2ad30 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2ad40 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2ad50 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2ad60 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2ad70 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2ad80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2ad90 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2ada0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2adb0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2adc0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2add0 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2ade0 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2adf0 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74 73  ll flag inhibits
2ae00 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2ae10 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
2ae20 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f  f whether.  ** o
2ae30 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2ae40 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2ae50 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61 20  is set during a 
2ae60 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  rollback..  **. 
2ae70 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20   ** Spilling is 
2ae80 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20  also prohibited 
2ae90 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72  when in an error
2aea0 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61   state since tha
2aeb0 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61  t could.  ** lea
2aec0 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
2aed0 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74  rruption.   In t
2aee0 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
2aef0 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a  mentaton it .  *
2af00 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
2af10 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
2af20 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
2af30 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
2af40 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68  eFlag==1.  ** wh
2af50 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
2af60 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
2af70 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2af80 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2af90 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
2afa0 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
2afb0 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
2afc0 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
2afd0 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
2afe0 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
2aff0 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
2b000 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
2b010 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
2b020 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2b030 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2b040 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2b050 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
2b060 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20  r->doNotSpill ) 
2b070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b080 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2b090 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26  doNotSyncSpill &
2b0a0 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  & (pPg->flags & 
2b0b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2b0c0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
2b0d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b0e0 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
2b0f0 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
2b100 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2b110 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
2b120 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
2b130 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
2b140 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69  he log. */.    i
2b150 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2b160 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20  age(pPg) ){ .   
2b170 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2b180 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20  alPage(pPg); .  
2b190 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2b1a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b1b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
2b1c0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
2b1d0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Pg, 0, 0);.    }
2b1e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
2b1f0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2b200 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71  rnal file if req
2b210 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  uired. */.    if
2b220 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2b230 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20  DR_NEED_SYNC .  
2b240 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
2b250 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
2b260 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
2b270 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
2b280 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
2b290 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 1);.    }.  . 
2b2a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
2b2b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
2b2c0 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
2b2d0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
2b2e0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20   size of.    ** 
2b2f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2b300 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
2b310 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
2b320 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b330 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
2b340 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c   because the cal
2b350 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65  l to pager_write
2b360 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f  _pagelist() belo
2b370 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a  w will not.    *
2b380 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65  * actually write
2b390 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
2b3a0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2b3b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f      **.    ** Co
2b3c0 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
2b3d0 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
2b3e0 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a   events:.    **.
2b3f0 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a      **   BEGIN;.
2b400 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72      **     <jour
2b410 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20  nal page X>.    
2b420 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
2b430 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
2b440 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
2b450 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68      **       <sh
2b460 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69  rink database fi
2b470 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20  le to Y pages>. 
2b480 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65     **       page
2b490 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
2b4a0 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42      **     ROLLB
2b4b0 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a  ACK TO sp;.    *
2b4c0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59  *.    ** If (X>Y
2b4d0 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67  ), then when pag
2b4e0 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c  erStress is call
2b4f0 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e  ed page X will n
2b500 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ot be written.  
2b510 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
2b520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
2b530 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
2b540 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
2b550 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20  e. Then,.    ** 
2b560 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
2b570 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
2b580 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
2b590 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
2b5a0 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66  ad.    ** data f
2b5b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2b5c0 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   file. This will
2b5d0 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
2b5e0 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20  page X as it.   
2b5f0 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65   ** was when the
2b600 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
2b610 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20  rted, not as it 
2b620 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f  was when "SAVEPO
2b630 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77  INT sp".    ** w
2b640 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  as executed..   
2b650 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
2b660 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
2b670 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2b680 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
2b690 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
2b6a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
2b6b0 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20  e now (if it is 
2b6c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72  not already ther
2b6d0 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77  e), so that it w
2b6e0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
2b6f0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
2b700 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
2b710 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
2b720 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a  O sp" is .    **
2b730 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a   executed..    *
2b740 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  /.    if( NEVER(
2b750 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c  .        rc==SQL
2b760 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70  ITE_OK && pPg->p
2b770 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
2b780 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
2b790 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20  esPage(pPg).    
2b7a0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2b7b0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b7c0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Pg);.    }.  .  
2b7d0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2b7e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2b7f0 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2b800 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b810 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b820 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b830 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2b840 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2b850 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2b860 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2b870 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2b880 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2b890 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2b8a0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2b8b0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2b8c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2b8d0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2b8e0 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2b8f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2b900 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2b910 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b920 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2b930 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2b940 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2b950 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a  r, rc); .}.../*.
2b960 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
2b970 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
2b980 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
2b990 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
2b9a0 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
2b9b0 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
2b9c0 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
2b9d0 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
2b9e0 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
2b9f0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
2ba00 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
2ba10 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
2ba20 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
2ba30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ba40 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
2ba50 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
2ba60 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
2ba70 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
2ba80 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
2ba90 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
2baa0 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
2bab0 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
2bac0 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
2bad0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
2bae0 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
2baf0 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
2bb00 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
2bb10 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
2bb20 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
2bb30 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
2bb40 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
2bb50 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2bb60 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
2bb70 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
2bb80 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
2bb90 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
2bba0 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
2bbb0 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
2bbc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
2bbd0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
2bbe0 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
2bbf0 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
2bc00 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
2bc10 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
2bc20 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
2bc30 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
2bc40 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
2bc50 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
2bc60 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2bc70 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2bc80 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2bc90 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2bca0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2bcb0 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2bcc0 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2bcd0 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2bce0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2bcf0 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2bd00 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2bd10 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2bd20 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2bd30 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2bd40 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2bd50 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2bd60 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2bd70 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2bd80 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2bd90 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2bda0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2bdb0 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2bdc0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2bdd0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2bde0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2bdf0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2be00 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2be10 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2be20 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2be30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2be40 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2be50 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2be60 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2be70 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2be80 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2be90 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2bea0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2beb0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2bec0 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2bed0 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2bee0 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2bef0 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2bf00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2bf10 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2bf20 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2bf30 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2bf40 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2bf50 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2bf60 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2bf70 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2bf80 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2bf90 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2bfa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2bfb0 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2bfc0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2bfd0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2bfe0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2bff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2c000 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2c010 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2c020 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2c030 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2c040 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2c050 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2c060 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2c070 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2c080 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2c090 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2c0a0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2c0b0 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2c0c0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2c0d0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2c0e0 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2c0f0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2c100 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2c110 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2c120 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2c130 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2c140 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2c150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2c160 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2c170 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2c180 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2c190 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2c1a0 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2c1b0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2c1c0 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2c1d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2c1e0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c1f0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2c200 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
2c210 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
2c220 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2c230 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
2c240 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
2c250 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
2c260 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c270 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
2c280 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
2c290 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
2c2a0 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
2c2b0 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
2c2c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c2d0 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
2c2e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c2f0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
2c300 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
2c310 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
2c320 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
2c330 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
2c340 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
2c350 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2c360 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
2c370 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
2c380 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
2c390 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c3a0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32   PCache */.  u32
2c3b0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2c3c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2c3d0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
2c3e0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
2c3f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c400 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55  Uri = 0;    /* U
2c410 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20  RI args to copy 
2c420 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  */.  int nUri = 
2c430 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
2c440 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2c450 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20   of URI args at 
2c460 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46  *zUri */..  /* F
2c470 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
2c480 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
2c490 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
2c4a0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
2c4b0 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
2c4c0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
2c4d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
2c4e0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
2c4f0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
2c500 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
2c510 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
2c520 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
2c530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2c540 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
2c550 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2c560 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
2c570 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
2c580 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
2c590 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
2c5a0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
2c5b0 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
2c5c0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
2c5d0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
2c5e0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
2c5f0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c600 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2c610 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
2c620 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
2c630 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
2c640 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
2c650 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c660 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
2c670 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
2c680 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c690 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c6a0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c6b0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
2c6c0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c6d0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c6e0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2c6f0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
2c700 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
2c710 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
2c720 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
2c730 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
2c740 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  ager = 0;..#ifnd
2c750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
2c760 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c  EMORYDB.  if( fl
2c770 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f  ags & PAGER_MEMO
2c780 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20  RY ){.    memDb 
2c790 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  = 1;.    if( zFi
2c7a0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2c7b0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ame[0] ){.      
2c7c0 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
2c7d0 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a  te3DbStrDup(0, z
2c7e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2c7f0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2c800 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0  ) return SQLI
2c810 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c820 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2c830 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2c840 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2c850 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2c860 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2c870 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2c880 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2c890 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2c8a0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2c8b0 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2c8c0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2c8d0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2c8e0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2c8f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2c900 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2c910 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2c920 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2c930 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2c940 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2c950 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2c960 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2c970 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2c980 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2c990 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2c9a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2c9b0 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2c9c0 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2c9d0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2c9e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c9f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2ca00 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
2ca10 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
2ca20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
2ca30 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
2ca40 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
2ca50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2ca60 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
2ca70 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
2ca80 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
2ca90 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  e);.    nPathnam
2caa0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2cab0 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2cac0 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26      z = zUri = &
2cad0 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65  zFilename[sqlite
2cae0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
2caf0 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ame)+1];.    whi
2cb00 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
2cb10 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2cb20 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20  en30(z)+1;.     
2cb30 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2cb40 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2cb50 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e  }.    nUri = (in
2cb60 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29  t)(&z[1] - zUri)
2cb70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55  ;.    assert( nU
2cb80 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ri>=0 );.    if(
2cb90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2cba0 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
2cbb0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2cbc0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2cbd0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
2cbe0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
2cbf0 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
2cc00 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
2cc10 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
2cc20 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
2cc30 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
2cc40 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
2cc50 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
2cc60 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
2cc70 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
2cc80 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
2cc90 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
2cca0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
2ccb0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2ccc0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
2ccd0 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
2cce0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2ccf0 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
2cd00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2cd10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2cd20 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2cd30 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2cd40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cd50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2cd60 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2cd70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2cd80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2cd90 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
2cda0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
2cdb0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
2cdc0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
2cdd0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
2cde0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
2cdf0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
2ce00 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
2ce10 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
2ce20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
2ce30 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
2ce40 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
2ce50 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
2ce80 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2ce90 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ceb0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
2cec0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
2ced0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2cee0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2cef0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
2cf00 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
2cf10 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
2cf20 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2cf30 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2cf40 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2cf50 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
2cf60 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2cf70 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2cf80 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2cf90 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
2cfa0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
2cfb0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2cfc0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
2cfd0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
2cfe0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2cff0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d000 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
2d010 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
2d020 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2d030 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
2d040 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
2d050 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
2d060 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
2d070 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2d080 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
2d090 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
2d0a0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
2d0b0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
2d0c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
2d0d0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
2d0e0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2d0f0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
2d100 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
2d110 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
2d120 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d130 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f  nUri +         /
2d140 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
2d150 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
2d160 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20   + 2            
2d170 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
2d180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d190 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e  OMIT_WAL.    + n
2d1a0 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32  Pathname + 4 + 2
2d1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2d1c0 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  Wal */.#endif.  
2d1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d1e0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d1f0 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  T(SQLITE_INT_TO_
2d200 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  PTR(journalFileS
2d210 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21  ize)) );.  if( !
2d220 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pPtr ){.    sqli
2d230 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d240 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
2d250 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d260 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
2d280 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
2d290 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
2d2a0 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
2d2b0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
2d2c0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
2d2d0 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
2d2e0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d2f0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d300 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
2d310 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
2d320 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2d330 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2d340 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
2d350 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
2d360 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
2d370 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d380 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
2d390 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2d3a0 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
2d3b0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d3c0 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
2d3d0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2d3e0 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
2d3f0 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
2d400 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
2d410 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
2d420 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
2d430 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
2d440 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
2d450 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
2d460 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29  t( nPathname>0 )
2d470 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  ;.    pPager->zJ
2d480 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
2d490 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
2d4a0 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29  name + 1 + nUri)
2d4b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2d4c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d4d0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d4e0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  name);.    if( n
2d4f0 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50  Uri ) memcpy(&pP
2d500 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2d510 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55  nPathname+1], zU
2d520 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  ri, nUri);.    m
2d530 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
2d540 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
2d550 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2d560 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d570 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2d580 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
2d590 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20  l\000", 8+2);.  
2d5a0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d5b0 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d5c0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d5d0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2d5e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2d5f0 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2d600 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2d610 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d620 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2d630 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2d640 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d650 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2d660 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2d670 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2d680 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20  al\000", 4+1);. 
2d690 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d6a0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d6b0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d6c0 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20  >zWal);.#endif. 
2d6d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d6e0 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2d6f0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
2d700 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
2d710 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
2d720 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
2d730 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
2d740 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2d750 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2d760 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2d770 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20   int fout = 0;  
2d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d790 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72    /* VFS flags r
2d7a0 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e  eturned by xOpen
2d7b0 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  () */.    rc = s
2d7c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
2d7d0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
2d7e0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
2d7f0 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  , vfsFlags, &fou
2d800 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
2d810 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65  !memDb );.    re
2d820 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
2d830 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2d840 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
2d850 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2d860 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2d870 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2d880 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2d890 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2d8a0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2d8b0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2d8c0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2d8d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2d8e0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2d8f0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2d900 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2d910 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2d920 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2d930 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2d940 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2d950 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2d960 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2d970 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2d980 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2d990 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2d9a0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2d9b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2d9c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2d9d0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2d9e0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2d9f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
2da00 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2da10 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2da20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2da30 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2da40 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2da50 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2da60 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2da70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
2da80 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
2da90 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2daa0 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
2dab0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2dac0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dad0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2dae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2daf0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2db00 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2db10 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2db20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2db30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2db40 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2db50 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2db60 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2db70 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2db80 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2db90 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
2dba0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
2dbb0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2dbc0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2dbd0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2dbe0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2dbf0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2dc00 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2dc10 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2dc20 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2dc30 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2dc40 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
2dc50 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2dc60 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2dc70 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2dc80 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2dc90 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
2dca0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
2dcb0 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
2dcc0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2dcd0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2dce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2dcf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2dd00 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2dd10 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2dd20 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2dd30 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2dd40 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2dd50 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2dd60 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2dd70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2dd80 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2dd90 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2dda0 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2ddb0 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2ddc0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2ddd0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2dde0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2ddf0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2de00 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2de10 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2de20 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2de30 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2de40 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2de50 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2de60 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2de70 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2de80 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2de90 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2dea0 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
2deb0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2dec0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2ded0 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20  AGER_READER;.   
2dee0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2def0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2df00 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2df10 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2df20 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2df30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2df40 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2df50 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2df60 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2df70 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2df80 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2df90 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2dfa0 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2dfb0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2dfc0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2dfd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dfe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2dff0 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2e000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e010 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2e020 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2e030 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2e040 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2e050 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2e060 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2e070 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
2e080 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
2e090 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
2e0a0 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
2e0b0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2e0c0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2e0d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e0e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2e0f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2e100 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
2e110 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2e120 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2e130 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2e140 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e150 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
2e160 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
2e170 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ject. */.  asser
2e180 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2e190 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55  ;.  nExtra = ROU
2e1a0 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ND8(nExtra);.  s
2e1b0 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2e1c0 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2e1d0 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1f0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2e200 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2e210 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2e220 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
2e230 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2e240 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2e250 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2e260 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e270 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2e280 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2e290 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2e2a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2e2b0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2e2c0 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2e2d0 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2e2e0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2e2f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e300 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2e310 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e320 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2e330 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2e340 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2e350 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2e360 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e370 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2e380 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2e390 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2e3a0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2e3b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2e3c0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2e3d0 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  ; */.#if 0.  ass
2e3e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2e3f0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
2e400 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
2e410 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
2e420 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ) );.#endif.  /*
2e430 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2e440 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e450 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2e460 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2e470 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2e480 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e490 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2e4a0 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2e4b0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2e4c0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2e4d0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2e4e0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2e4f0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2e500 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e510 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2e520 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2e530 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2e540 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e550 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2e560 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2e570 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2e580 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2e590 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2e5a0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2e5b0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2e5c0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2e5d0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2e5e0 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  le;.  if( pPager
2e5f0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2e600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2e610 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  fullSync==0 );. 
2e620 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e630 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2e640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e650 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2e660 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2e670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2e680 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2e690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2e6a0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2e6b0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2e6c0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
2e6d0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2e6e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
2e6f0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2e700 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c  TE_SYNC_NORMAL |
2e710 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
2e720 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67  CTIONS;.    pPag
2e730 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e740 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e750 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
2e760 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2e770 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e780 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2e790 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2e7a0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2e7b0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2e7c0 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2e7d0 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2e7e0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2e7f0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2e800 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2e810 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2e820 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2e830 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2e840 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2e850 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2e860 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2e870 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2e880 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2e890 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2e8a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2e8b0 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2e8c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2e8d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2e8e0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2e8f0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2e900 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2e910 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2e920 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2e930 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2e940 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2e950 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2e960 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2e970 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2e980 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
2e990 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2e9a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e9b0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
2e9c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2e9d0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2e9e0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2e9f0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2ea00 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2ea10 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2ea20 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2ea30 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2ea40 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2ea50 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2ea60 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2ea70 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2ea80 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2ea90 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2eaa0 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2eab0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2eac0 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2ead0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2eae0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2eaf0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2eb00 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2eb10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2eb20 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2eb30 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2eb40 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2eb50 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2eb60 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2eb70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2eb80 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2eb90 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2eba0 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2ebb0 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2ebc0 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2ebd0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2ebe0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2ebf0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2ec00 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2ec10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2ec20 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2ec30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ec40 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2ec50 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2ec60 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2ec70 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2ec80 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2ec90 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2eca0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2ecb0 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2ecc0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2ecd0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2ece0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2ecf0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2ed00 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2ed10 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2ed20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2ed30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ed40 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2ed50 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2ed60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2ed70 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2ed80 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2ed90 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2eda0 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2edb0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2edc0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2edd0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2ede0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2edf0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2ee00 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2ee10 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2ee20 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2ee30 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2ee40 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2ee50 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2ee60 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2ee70 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2ee80 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2ee90 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2eea0 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2eeb0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2eec0 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2eed0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2eee0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2eef0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2ef00 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2ef10 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2ef20 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2ef30 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2ef40 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2ef50 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2ef60 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2ef70 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2ef80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2ef90 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2efa0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2efb0 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2efc0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2efd0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2efe0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2eff0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2f000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2f010 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2f020 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2f030 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2f040 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2f050 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2f060 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2f070 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2f080 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2f090 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2f0a0 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2f0b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2f0c0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2f0d0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2f0e0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2f0f0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2f100 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2f110 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2f120 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2f130 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2f140 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2f150 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2f160 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2f170 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2f180 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2f190 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2f1a0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2f1b0 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2f1c0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2f1d0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2f1e0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2f1f0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2f200 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2f210 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2f220 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2f230 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2f240 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2f250 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2f260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f270 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2f280 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2f290 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f2a0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2f2b0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f2c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2f2d0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2f2e0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2f2f0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2f300 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2f310 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2f320 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2f330 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2f340 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2f350 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2f360 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2f370 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2f380 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2f390 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2f3a0 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2f3b0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2f3c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2f3d0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2f3e0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2f3f0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2f400 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2f410 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2f420 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2f430 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2f440 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2f450 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2f460 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2f470 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2f480 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2f490 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2f4a0 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2f4b0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2f4c0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2f4d0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2f4e0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2f4f0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2f500 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2f510 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2f520 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2f530 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2f540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f550 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2f560 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2f570 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2f580 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
2f590 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2f5a0 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
2f5b0 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
2f5c0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
2f5d0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2f5e0 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
2f5f0 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
2f600 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
2f610 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
2f620 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
2f630 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
2f640 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
2f650 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
2f660 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
2f670 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
2f680 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
2f690 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
2f6a0 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
2f6b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2f6c0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2f6d0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2f6e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f700 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
2f710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2f720 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
2f730 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2f740 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
2f750 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
2f760 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
2f770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f780 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
2f790 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
2f7a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
2f7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f7c0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2f7d0 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
2f7e0 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
2f7f0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2f800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f810 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
2f820 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2f830 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f840 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
2f850 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f860 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
2f870 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
2f880 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
2f890 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
2f8a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2f8b0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
2f8c0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
2f8d0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
2f8e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
2f8f0 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
2f900 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2f910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2f920 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2f930 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
2f940 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
2f950 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
2f960 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
2f970 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
2f980 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
2f990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f9a0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
2f9b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2f9c0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
2f9d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
2f9e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f9f0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
2fa00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2fa10 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2fa20 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2fa30 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
2fa40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2fa50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2fa60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fa70 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
2fa80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2fa90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2faa0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
2fab0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
2fac0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
2fad0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2fae0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2faf0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
2fb00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2fb10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2fb20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2fb30 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2fb40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fb50 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2fb60 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2fb70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fb80 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2fb90 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
2fba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2fbb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
2fbc0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
2fbd0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
2fbe0 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
2fbf0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
2fc00 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
2fc10 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
2fc20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20     ** its has a 
2fc30 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61  zero header, tha
2fc40 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
2fc50 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20  o an I/O error, 
2fc60 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  or.            *
2fc70 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75  * it might be du
2fc80 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f  e to the race co
2fc90 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
2fca0 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20  d above and in. 
2fcb0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69             ** ti
2fcc0 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74  cket #3883.  Eit
2fcd0 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20  her way, assume 
2fce0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2fcf0 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20   is hot..       
2fd00 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2fd10 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f  ht be a false po
2fd20 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20  sitive.  But if 
2fd30 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a  it is, then the.
2fd40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61              ** a
2fd50 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c  utomatic journal
2fd60 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65   playback and re
2fd70 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d  covery mechanism
2fd80 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20   will deal.     
2fd90 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69         ** with i
2fda0 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55  t under an EXCLU
2fdb0 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20  SIVE lock where 
2fdc0 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2fdd0 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
2fde0 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77   worry so much w
2fdf0 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69  ith race conditi
2fe00 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ons..           
2fe10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2fe20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
2fe30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2fe40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2fe50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2fe60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2fe70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2fe80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2fe90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2fea0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
2feb0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
2fec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2fed0 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
2fee0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  to call sqlite3P
2fef0 61 67 65 72 41 63 71 75 69 72 65 28 29 20 75 6e  agerAcquire() un
2ff00 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
2ff10 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
2ff20 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
2ff30 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
2ff40 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
2ff50 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
2ff60 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2ff70 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2ff80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2ff90 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
2ffa0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
2ffb0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
2ffc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2ffd0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
2ffe0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
2fff0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
30000 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
30010 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
30020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30030 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
30040 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
30050 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
30060 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
30070 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30080 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
30090 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
300a0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
300b0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
300c0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
300d0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
300e0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
300f0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
30100 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
30110 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
30120 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
30130 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
30140 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
30150 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
30160 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
30170 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
30180 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
30190 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
301a0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
301b0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
301c0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
301d0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
301e0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
301f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
30200 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
30210 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
30220 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
30230 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
30240 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
30250 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
30260 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
30270 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
30280 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
30290 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
302a0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
302b0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
302c0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
302d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
302e0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
302f0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
30300 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
30310 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
30320 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
30330 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
30340 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
30350 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
30360 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
30370 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
30380 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
30390 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
303a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
303b0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
303c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
303d0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
303e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
303f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
30400 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
30410 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
30420 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30430 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
30440 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30450 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
30460 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
30470 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
30480 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
30490 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
304a0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
304b0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
304c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
304d0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
304e0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
304f0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
30500 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
30510 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
30520 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
30530 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
30540 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
30550 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30560 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30570 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30580 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
30590 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
305a0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
305b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
305c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
305d0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
305e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
305f0 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
30600 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
30610 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
30620 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30630 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
30640 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
30650 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
30660 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30670 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
30680 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
30690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
306a0 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
306b0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
306c0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
306d0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
306e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
306f0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
30700 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30710 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30740 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
30750 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
30760 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
30770 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
30780 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
30790 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
307a0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
307b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
307c0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
307d0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
307e0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
307f0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
30800 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
30810 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
30820 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
30830 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
30840 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
30850 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
30860 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
30870 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
30880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
308a0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
308b0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
308c0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
308d0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
308e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
308f0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
30900 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
30910 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
30920 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30930 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
30940 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
30950 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
30960 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
30970 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
30980 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
30990 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
309a0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
309b0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
309c0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
309d0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
309e0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
309f0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
30a00 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
30a10 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
30a20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
30a30 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
30a40 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
30a50 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
30a60 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
30a70 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
30a80 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
30a90 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
30aa0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
30ab0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
30ac0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
30ad0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
30ae0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
30af0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
30b00 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
30b10 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
30b20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
30b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
30b40 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
30b50 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
30b60 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
30b70 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
30b80 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
30b90 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
30ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30bb0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
30bc0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
30bd0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
30be0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
30bf0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
30c00 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
30c10 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
30c20 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
30c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
30c40 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
30c50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30c60 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
30c70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
30c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30ca0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30cb0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
30cc0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
30cd0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
30ce0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
30cf0 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
30d00 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
30d10 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
30d20 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
30d30 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
30d40 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
30d50 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
30d60 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
30d70 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
30d80 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
30d90 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
30da0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
30db0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
30dc0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
30dd0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
30de0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
30df0 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
30e00 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
30e10 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
30e20 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
30e30 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
30e40 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
30e50 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
30e60 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
30e70 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
30e80 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
30e90 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
30ea0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
30eb0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
30ec0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
30ed0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
30ee0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
30ef0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
30f00 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
30f10 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
30f20 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
30f30 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
30f40 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
30f50 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
30f60 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
30f70 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
30f80 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
30f90 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
30fa0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
30fb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
30fc0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
30fd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
30fe0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
30ff0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31000 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
31010 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
31020 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
31030 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
31040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31050 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
31060 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
31070 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31080 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
31090 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
310a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
310b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
310c0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
310d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
310e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
310f0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
31100 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
31110 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
31120 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
31130 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
31140 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31150 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
31160 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
31170 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
31180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31190 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
311a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
311b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
311c0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
311d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
311e0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
311f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
31200 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31220 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
31230 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
31240 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31250 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
31260 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
31270 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
31280 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
31290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
312a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
312b0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
312c0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
312d0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
312e0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
312f0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
31300 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
31310 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
31320 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
31330 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
31340 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
31350 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
31360 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
31370 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
31380 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
31390 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
313a0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
313b0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
313c0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
313d0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
313e0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
313f0 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
31400 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
31410 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
31420 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
31430 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
31440 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
31450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
31460 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
31470 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
31480 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
31490 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
314a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
314b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
314c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
314d0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
314e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
314f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31500 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31510 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
31520 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
31530 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
31540 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
31550 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
31560 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
31570 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
31580 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
31590 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
315a0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
315b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
315c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
315d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
315e0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
315f0 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
31600 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
31610 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
31620 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
31630 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
31640 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
31650 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
31660 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
31670 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
31680 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
31690 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
316a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
316b0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
316c0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
316d0 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
316e0 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
316f0 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
31700 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
31710 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
31720 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
31730 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
31740 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
31750 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
31760 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
31770 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
31780 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31790 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
317a0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
317b0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
317c0 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
317d0 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
317e0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
317f0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
31800 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
31810 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
31820 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
31830 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
31840 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
31850 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
31860 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
31870 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
31880 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
31890 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
318a0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
318b0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
318c0 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
318d0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
318e0 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
318f0 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
31900 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
31910 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
31920 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
31930 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
31940 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
31950 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
31960 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
31970 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
31980 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
31990 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
319a0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
319b0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
319c0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
319d0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
319e0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
319f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
31a00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31a10 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
31a20 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
31a30 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
31a40 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
31a50 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
31a60 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
31a70 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
31a80 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
31a90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
31aa0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31ab0 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 70 50   && (.        pP
31ac0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20  ager->pBackup . 
31ad0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63      || sqlite3Pc
31ae0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
31af0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
31b00 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
31b10 2d 3e 70 4d 61 70 0a 20 20 20 20 29 29 7b 0a 20  ->pMap.    )){. 
31b20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
31b30 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
31b40 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
31b50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31b60 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
31b70 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
31b80 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
31b90 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
31ba0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
31bb0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
31bc0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
31bd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
31be0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
31bf0 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
31c00 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
31c10 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
31c20 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
31c30 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
31c40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31c50 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
31c60 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
31c70 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
31c80 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
31c90 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
31ca0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
31cb0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
31cc0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
31cd0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
31ce0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
31cf0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
31d00 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
31d10 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
31d20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
31d30 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
31d40 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
31d50 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
31d60 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
31d70 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
31d80 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
31d90 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
31da0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
31db0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
31dc0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
31dd0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
31de0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
31df0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
31e00 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
31e10 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
31e20 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
31e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
31e40 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
31e50 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
31e60 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
31e70 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
31e80 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
31e90 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
31ea0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
31eb0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31ec0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
31ed0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
31ee0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
31ef0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
31f00 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
31f10 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
31f20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31f30 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
31f40 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
31f50 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
31f60 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
31f70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31f90 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31fa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31fc0 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
31fd0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
31fe0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
31ff0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
32000 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
32010 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
32020 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
32030 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
32040 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
32050 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
32060 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
32070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32080 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
32090 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
320a0 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
320b0 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
320c0 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
320d0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
320e0 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
320f0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
32100 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
32110 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
32120 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
32130 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
32140 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
32150 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
32160 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
32170 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
32180 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
32190 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
321a0 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
321b0 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
321c0 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
321d0 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
321e0 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
321f0 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
32200 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55 6e  .        pagerUn
32210 6d 61 70 28 70 50 61 67 65 72 29 3b 0a 20 20 20  map(pPager);.   
32220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
32230 67 65 72 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20  ger->pMap ){.   
32240 20 20 20 20 20 70 50 61 67 65 72 2d 3e 62 4d 61       pPager->bMa
32250 70 52 65 73 69 7a 65 20 3d 20 31 3b 0a 20 20 20  pResize = 1;.   
32260 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32270 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
32280 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
32290 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
322a0 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
322b0 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
322c0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
322d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
322e0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
322f0 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
32300 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
32310 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
32320 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53  ager);.#ifndef S
32330 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
32340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32350 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
32360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23  ==SQLITE_OK );.#
32370 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
32380 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32390 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
323a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
323b0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
323c0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
323d0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
323e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
323f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32400 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
32410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
32420 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
32430 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
32440 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
32450 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
32460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32470 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
32480 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
32490 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
324a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
324b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
324c0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
324d0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
324e0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
324f0 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65  READER;.  }.  re
32500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32510 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
32520 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
32530 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
32540 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
32550 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
32560 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
32570 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
32580 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
32590 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
325a0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
325b0 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
325c0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
325d0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
325e0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
325f0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
32600 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
32610 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
32620 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
32630 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
32640 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
32650 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
32660 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
32670 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32680 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
32690 3d 30 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  =0) && pPager->n
326a0 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  MmapOut==0 ){.  
326b0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
326c0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
326d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
326e0 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
326f0 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
32700 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
32710 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
32720 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
32730 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
32740 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
32750 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
32760 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
32770 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
32780 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
32790 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
327a0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
327b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
327c0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
327d0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
327e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
327f0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
32800 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
32810 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
32820 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
32830 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
32840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32850 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
32860 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
32870 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
32880 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
32890 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
328a0 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
328b0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
328c0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
328d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
328e0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
328f0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
32900 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
32910 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
32920 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
32930 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
32940 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
32950 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
32960 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
32970 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
32980 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
32990 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
329a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
329b0 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
329c0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
329d0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
329e0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
329f0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
32a00 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
32a10 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
32a20 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
32a30 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
32a40 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
32a50 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
32a60 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
32a70 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
32a80 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
32a90 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
32aa0 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
32ab0 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
32ac0 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
32ad0 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
32ae0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32af0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
32b00 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
32b10 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
32b20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
32b30 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
32b40 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
32b50 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
32b60 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
32b70 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
32b80 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
32b90 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
32ba0 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
32bb0 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
32bc0 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
32bd0 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
32be0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
32bf0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
32c00 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
32c10 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
32c20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
32c30 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
32c40 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
32c50 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62 65   the cache to be
32c60 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
32c70 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20   data read.**   
32c80 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65     from the save
32c90 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  point journal..*
32ca0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
32cb0 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
32cc0 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
32cd0 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
32ce0 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20  ead of.** being 
32cf0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
32d00 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
32d10 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
32d20 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
32d30 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
32d40 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
32d50 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
32d60 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
32d70 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
32d80 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
32d90 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
32da0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
32db0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
32dc0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
32dd0 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
32de0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
32df0 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
32e00 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
32e10 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
32e20 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
32e30 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
32e40 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
32e50 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
32e60 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
32e70 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
32e80 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
32e90 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
32ea0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
32eb0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
32ec0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
32ed0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
32ee0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
32ef0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
32f00 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
32f10 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
32f20 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
32f30 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
32f40 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
32f50 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
32f60 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
32f70 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
32f80 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
32f90 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
32fa0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
32fb0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
32fc0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
32fd0 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
32fe0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
32ff0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
33000 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
33010 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
33020 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
33030 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
33040 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
33050 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
33060 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
33070 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
33080 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
33090 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
330a0 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
330b0 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
330c0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
330d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
330e0 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
330f0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33100 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33110 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
33120 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
33130 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
33140 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
33150 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
33160 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
33170 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33180 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33190 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
331a0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
331b0 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 58   PAGER_ACQUIRE_X
331c0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
331d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
331e0 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
331f0 67 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69  g = 0;.  const i
33200 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
33210 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 41 43  flags & PAGER_AC
33220 51 55 49 52 45 5f 4e 4f 43 4f 4e 54 45 4e 54 29  QUIRE_NOCONTENT)
33230 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63  ;..  /* It is ac
33240 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ceptable to use 
33250 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61  a read-only (mma
33260 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20  p) page for any 
33270 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a  page except.  **
33280 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65   page 1 if there
33290 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
332a0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72  nsaction open or
332b0 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41   the ACQUIRE_REA
332c0 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20  DONLY.  ** flag 
332d0 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79  was specified by
332e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64   the caller. And
332f0 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   so long as the 
33300 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a  db is not a .  *
33310 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  * temporary or i
33320 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
33330 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  e.  */.  const i
33340 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 50  nt bMmapOk = (pP
33350 61 67 65 72 2d 3e 6e 4d 61 70 4c 69 6d 69 74 3e  ager->nMapLimit>
33360 30 20 26 26 20 70 67 6e 6f 21 3d 31 0a 20 20 20  0 && pgno!=1.   
33370 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
33380 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
33390 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47   || (flags & PAG
333a0 45 52 5f 41 43 51 55 49 52 45 5f 52 45 41 44 4f  ER_ACQUIRE_READO
333b0 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73  NLY)).  );..  as
333c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
333d0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
333e0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
333f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
33400 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
33410 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
33420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33430 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33440 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33450 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
33460 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
33470 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
33480 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
33490 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
334a0 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
334b0 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
334c0 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
334d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
334e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
334f0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
33500 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  ode;.  }else{.. 
33510 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 29     if( bMmapOk )
33520 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
33530 65 72 2d 3e 70 4d 61 70 3d 3d 30 20 7c 7c 20 28  er->pMap==0 || (
33540 70 50 61 67 65 72 2d 3e 62 4d 61 70 52 65 73 69  pPager->bMapResi
33550 7a 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 4d  ze && pPager->nM
33560 6d 61 70 4f 75 74 3d 3d 30 29 20 29 7b 0a 20 20  mapOut==0) ){.  
33570 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33580 4d 61 70 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Map(pPager);.   
33590 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
335a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
335b0 70 50 61 67 65 72 2d 3e 6e 4d 61 70 3e 3d 28 28  pPager->nMap>=((
335c0 69 36 34 29 70 67 6e 6f 20 2a 20 70 50 61 67 65  i64)pgno * pPage
335d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
335e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
335f0 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
33600 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20  _READER ){.     
33610 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
33620 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
33630 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33640 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
33650 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33660 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
33670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
33680 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
33690 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
336a0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  &pPg);.        }
336b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
336c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
336d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
336e0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
336f0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
33700 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33720 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33750 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
33760 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
33770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
33780 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
33790 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
337a0 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70  che, pgno, 1, pp
337b0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
337c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
337d0 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
337e0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
337f0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
33800 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
33810 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
33820 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
33830 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
33840 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
33850 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
33860 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
33870 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
33880 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
33890 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
338a0 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
338b0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
338c0 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
338d0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
338e0 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
338f0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
33900 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50  age)->pPager==pP
33910 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65  ager || (*ppPage
33920 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  )->pPager==0 );.
33930 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
33940 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
33950 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
33960 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
33970 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
33980 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
33990 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
339a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
339b0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
339c0 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
339d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
339e0 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
339f0 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
33a00 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
33a10 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) );.    pPager-
33a20 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
33a30 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65  T_HIT]++;.    re
33a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33a50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
33a60 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
33a70 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
33a80 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
33a90 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
33aa0 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
33ab0 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70  ized.  */..    p
33ac0 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
33ad0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
33ae0 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
33af0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
33b00 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
33b10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
33b20 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
33b30 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
33b40 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
33b50 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
33b60 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
33b70 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
33b80 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
33b90 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
33ba0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
33bb0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
33bc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
33bd0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
33be0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
33bf0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
33c00 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
33c10 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
33c20 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
33c30 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
33c40 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
33c50 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
33c60 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
33c70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
33c80 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
33c90 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
33ca0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
33cb0 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
33cc0 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
33cd0 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
33ce0 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
33cf0 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
33d00 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
33d10 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
33d20 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
33d30 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
33d40 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
33d50 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
33d60 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
33d70 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
33d80 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
33d90 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
33da0 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
33db0 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
33dc0 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
33dd0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
33de0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
33df0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
33e00 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
33e10 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
33e20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
33e30 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
33e40 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
33e50 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
33e60 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
33e70 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
33e80 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
33e90 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
33ea0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
33eb0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
33ec0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
33ed0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
33ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33ef0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
33f00 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
33f10 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
33f20 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
33f30 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
33f40 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
33f50 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
33f60 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
33f70 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
33f80 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
33f90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
33fa0 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
33fb0 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
33fc0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
33fd0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
33fe0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
33ff0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
34000 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
34010 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
34020 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20  AT_MISS]++;.    
34030 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
34040 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
34050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34060 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
34070 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34080 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
34090 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
340a0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
340b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
340c0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
340d0 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
340e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
340f0 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
34100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
34110 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
34120 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
34130 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
34140 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
34150 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34160 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
34170 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
34180 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
34190 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
341a0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
341b0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
341c0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
341d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
341e0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
341f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34200 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53   cache. .**.** S
34210 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
34220 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
34230 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
34240 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
34250 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
34260 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
34270 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
34280 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
34290 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
342a0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
342b0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
342c0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
342d0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
342e0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
342f0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
34300 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
34310 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
34320 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
34330 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
34340 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
34350 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
34360 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
34370 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73  r *pPg = 0;.  as
34380 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
34390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
343a0 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
343b0 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
343c0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
343d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
343e0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
343f0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
34400 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
34410 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
34420 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
34430 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
34440 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  &pPg);.  return 
34450 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
34460 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
34470 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
34480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
34490 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
344a0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
344b0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
344c0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
344d0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
344e0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
344f0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
34500 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
34510 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
34520 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
34530 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34540 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
34550 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
34560 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
34570 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
34580 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  g ){.    Pager *
34590 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
345a0 61 67 65 72 3b 0a 20 20 20 20 69 66 28 20 70 50  ager;.    if( pP
345b0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
345c0 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 20 20 70  _MMAP ){.      p
345d0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
345e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ge(pPg);.    }el
345f0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
34600 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
34610 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
34620 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
34630 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ed(pPager);.  }.
34640 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
34650 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
34660 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
34670 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
34680 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
34690 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
346a0 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
346b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
346c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
346d0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
346e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
346f0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
34700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34710 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
34720 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
34730 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
34740 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
34750 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
34760 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
34770 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
34780 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
34790 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
347a0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
347b0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
347c0 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
347d0 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
347e0 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
347f0 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
34800 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
34810 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
34820 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
34830 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
34840 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
34850 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
34860 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
34870 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
34880 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
34890 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
348a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
348b0 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
348c0 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
348d0 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
348e0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
348f0 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
34900 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
34910 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
34920 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
34930 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
34940 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
34950 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
34960 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
34970 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
34980 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
34990 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
349a0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
349b0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
349c0 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
349d0 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
349e0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
349f0 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
34a00 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
34a10 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
34a20 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
34a30 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
34a40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
34a50 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
34a60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
34a70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34a80 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
34a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
34aa0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
34ab0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
34ac0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
34ad0 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
34ae0 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
34af0 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
34b00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
34b10 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
34b20 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61  ER_LOCKED );.  a
34b30 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
34b40 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
34b50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34b60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
34b70 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  l==0 );.  .  /* 
34b80 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  If already in th
34b90 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74  e error state, t
34ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34bb0 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e  a no-op.  But on
34bc0 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20  .  ** the other 
34bd0 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69  hand, this routi
34be0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
34bf0 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72  ed if we are alr
34c00 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20  eady in.  ** an 
34c10 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a  error state. */.
34c20 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
34c30 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
34c40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
34c50 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70  rCode;..  if( !p
34c60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34c70 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  r) && pPager->jo
34c80 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
34c90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
34ca0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
34cb0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
34cc0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
34cd0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
34ce0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
34cf0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
34d00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
34d10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
34d20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
34d30 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
34d40 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
34d50 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
34d60 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
34d70 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
34d80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
34d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
34da0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
34db0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
34dc0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
34dd0 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
34de0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
34df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
34e00 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
34e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74    /* VFS flags t
34e30 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  o open journal f
34e40 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
34e50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
34e60 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
34e70 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
34e80 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
34e90 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
34ea0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
34eb0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
34ec0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
34ed0 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
34ee0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
34ef0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
34f00 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  L).          );.
34f10 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
34f20 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
34f30 49 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ITE.        rc =
34f40 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
34f50 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  pen(.           
34f60 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
34f70 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
34f80 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
34f90 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
34fa0 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  er).        );. 
34fb0 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72   #else.        r
34fc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
34fd0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
34fe0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
34ff0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
35000 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20  ;.  #endif.     
35010 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
35020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
35030 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
35040 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
35050 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
35060 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
35070 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
35080 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
35090 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
350a0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
350b0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
350c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
350d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
350e0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
350f0 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
35100 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
35110 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
35120 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
35130 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
35140 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
35150 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
35160 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
35170 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
35180 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
35190 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
351a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
351b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
351c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
351d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
351e0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
351f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
35200 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
35210 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
35220 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
35230 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
35240 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
35250 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
35260 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
35270 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
35280 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
35290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
352a0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
352b0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
352c0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
352d0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
352e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
352f0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
35300 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
35310 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
35320 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
35330 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
35340 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
35350 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
35360 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
35370 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
35380 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
35390 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
353a0 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
353b0 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
353c0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
353d0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
353e0 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
353f0 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
35400 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
35410 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
35420 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
35430 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
35440 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
35450 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
35460 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
35470 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
35480 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
35490 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
354a0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
354b0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
354c0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
354d0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
354e0 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
354f0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
35500 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
35510 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
35520 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
35530 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
35540 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
35550 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
35560 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
35570 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
35580 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
35590 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
355a0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
355b0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
355c0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
355d0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
355e0 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
355f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35600 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
35610 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
35620 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
35630 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
35640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
35650 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
35660 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
35670 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
35680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35690 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
356a0 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
356b0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
356c0 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
356d0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
356e0 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
356f0 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
35700 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
35710 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
35720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35730 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35740 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
35750 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
35760 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
35770 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
35780 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
35790 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
357a0 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
357b0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
357c0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
357d0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
357e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
357f0 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
35800 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
35810 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
35820 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
35830 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
35840 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
35850 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
35860 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
35870 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
35880 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
35890 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
358a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
358b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
358c0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
358d0 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
358e0 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
358f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
35900 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
35910 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
35920 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
35930 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
35940 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
35950 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
35960 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
35970 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
35980 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
35990 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
359a0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
359b0 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
359c0 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
359d0 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
359e0 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
359f0 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
35a00 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
35a10 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
35a20 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
35a30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35a40 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
35a50 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
35a60 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
35a70 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
35a80 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
35a90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
35aa0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
35ab0 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
35ac0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
35ad0 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
35ae0 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
35af0 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
35b00 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
35b10 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
35b20 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
35b30 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
35b40 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
35b50 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
35b60 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
35b70 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
35b80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
35b90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35ba0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
35bb0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
35bc0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
35bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35be0 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
35bf0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
35c00 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
35c10 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
35c20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
35c30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
35c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35c50 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
35c60 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
35c70 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
35c80 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
35c90 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
35ca0 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
35cb0 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
35cc0 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
35cd0 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
35ce0 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
35cf0 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
35d00 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
35d10 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
35d20 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
35d30 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
35d40 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
35d50 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
35d60 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
35d70 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
35d80 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
35d90 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
35da0 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
35db0 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
35dc0 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
35dd0 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
35de0 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
35df0 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
35e00 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
35e10 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
35e20 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
35e30 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
35e40 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
35e50 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
35e60 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
35e70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
35e80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
35e90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
35ea0 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
35eb0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
35ec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
35ed0 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ff = 0;.    }.. 
35ee0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
35ef0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
35f00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
35f10 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
35f20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35f30 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
35f40 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35f50 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35f60 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
35f70 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35f80 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20  Pager) );.  }.. 
35f90 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
35fa0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
35fb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
35fc0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
35fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
35fe0 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
35ff0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
36000 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
36010 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
36020 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
36030 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
36040 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
36050 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
36060 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
36070 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
36080 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
36090 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
360a0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
360b0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
360c0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
360d0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
360e0 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
360f0 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
36100 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
36110 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
36120 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
36130 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
36140 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
36150 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
36160 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
36170 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
36180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
36190 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
361a0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c  s not called unl
361b0 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ess a write-tran
361c0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
361d0 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73  ady .  ** been s
361e0 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72  tarted. The jour
361f0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20  nal file may or 
36200 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20  may not be open 
36210 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  at this point.. 
36220 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20   ** It is never 
36230 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52  called in the ER
36240 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a  ROR state..  */.
36250 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36260 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36270 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
36280 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
36290 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
362a0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
362b0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
362c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
362d0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
362e0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
362f0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
36300 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ger) );..  /* If
36310 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
36320 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
36330 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74  tected, report t
36340 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20  he same error.  
36350 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73  ** again. This s
36360 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e  hould not happen
36370 2c 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20  , but the check 
36380 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e  provides robustn
36390 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
363a0 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
363b0 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70  ode) )  return p
363c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
363d0 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76  .  /* Higher-lev
363e0 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65  el routines neve
363f0 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  r call this func
36400 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65  tion if database
36410 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69   is not.  ** wri
36420 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63  table.  But chec
36430 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66  k anyway, just f
36440 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  or robustness. *
36450 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
36460 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ager->readOnly) 
36470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
36480 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  PERM;..  CHECK_P
36490 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
364a0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
364b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65   needs to be ope
364c0 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65  ned. Higher leve
364d0 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20  l routines have 
364e0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74  already.  ** obt
364f0 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73  ained the necess
36500 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67  ary locks to beg
36510 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  in the write-tra
36520 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68  nsaction, but th
36530 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  e.  ** rollback 
36540 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
36550 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f  t yet be open. O
36560 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68  pen it now if th
36570 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  is is the case..
36580 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69    **.  ** This i
36590 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61  s done before ca
365a0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
365b0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f  cheMakeDirty() o
365c0 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a  n the page. .  *
365d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
365e0 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74  it were done aft
365f0 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  er calling sqlit
36600 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36610 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  y(), then.  ** a
36620 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63  n error might oc
36630 63 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65  cur and the page
36640 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69  r would end up i
36650 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
36660 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20  state.  ** with 
36670 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20  pages marked as 
36680 64 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63  dirty in the cac
36690 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  he..  */.  if( p
366a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
366b0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
366c0 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ED ){.    rc = p
366d0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
366e0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
366f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36700 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36710 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
36720 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
36730 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
36740 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
36750 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36760 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
36770 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
36780 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
36790 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
367a0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
367b0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
367c0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
367d0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
367e0 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
367f0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36800 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61  y(pPg);.  if( pa
36810 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
36820 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65   && !subjRequire
36830 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
36840 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
36850 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
36860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  ;.  }else{.  .  
36870 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
36880 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
36890 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
368a0 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
368b0 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
368c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
368d0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
368e0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
368f0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
36900 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
36910 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
36920 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
36930 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
36940 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
36950 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
36960 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
36970 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
36980 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
36990 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29  Wal(pPager)==0 )
369a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
369b0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
369c0 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f  bOrigSize && isO
369d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
369e0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
369f0 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
36a00 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20  har *pData2;.   
36a10 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20       i64 iOff = 
36a20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36a30 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ff;..        /* 
36a40 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
36a50 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
36a60 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
36a70 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
36a80 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
36a90 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
36aa0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
36ab0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
36ac0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
36ad0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
36ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
36af0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
36b00 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
36b10 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
36b20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
36b30 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lHdr<=pPager->jo
36b40 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
36b50 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
36b60 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
36b70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
36b80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
36b90 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
36ba0 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
36bb0 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
36bc0 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20  Data2);..       
36bd0 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
36be0 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
36bf0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
36c00 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
36c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
36c20 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
36c30 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
36c40 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
36c50 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
36c60 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
36c70 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
36c80 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
36c90 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
36ca0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
36cb0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
36cc0 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
36cd0 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
36ce0 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
36cf0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
36d00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
36d10 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
36d20 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
36d30 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
36d40 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
36d50 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
36d60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
36d70 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
36d80 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
36d90 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  C;..        rc =
36da0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
36db0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20  ger->jfd, iOff, 
36dc0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
36dd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
36de0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
36df0 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
36e00 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
36e10 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
36e20 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
36e30 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
36e40 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
36e50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
36e60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
36e70 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
36e80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
36e90 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
36ea0 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  e+4, cksum);.   
36eb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36ec0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36ed0 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54  rc;..        IOT
36ee0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
36ef0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
36f00 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
36f10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
36f20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36f30 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
36f40 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
36f50 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
36f60 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
36f70 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
36f80 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
36f90 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
36fa0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
36fb0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
36fc0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
36fd0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
36fe0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
36ff0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37000 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37010 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
37020 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
37030 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
37040 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38  >journalOff += 8
37050 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
37060 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
37070 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
37080 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
37090 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
370a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
370b0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
370c0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
370d0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
370e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
370f0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
37100 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
37110 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
37120 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
37130 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
37140 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
37150 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
37160 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
37170 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
37180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
371a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
371b0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
371c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
371d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
371e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
371f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37200 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
37210 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
37220 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
37230 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37240 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37250 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
37260 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
37270 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
37280 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37290 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
372a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
372b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
372c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
372d0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
372e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
372f0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
37300 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
37310 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
37320 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
37330 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
37340 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
37350 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
37360 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
37370 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
37380 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
37390 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
373a0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
373b0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
373c0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
373d0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
373e0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
373f0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
37400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37410 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
37420 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
37430 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
37440 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
37450 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
37460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
37470 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
37480 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
37490 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
374a0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
374b0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
374c0 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
374d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
374e0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
374f0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
37500 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
37510 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
37520 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61  e .** making cha
37530 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20  nges to a page. 
37540 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
37550 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
37560 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68   value .** of th
37570 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
37580 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
37590 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  o change any pag
375a0 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a  e data unless .*
375b0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
375c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
375d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
375e0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
375f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
37600 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
37610 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
37620 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
37630 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
37640 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
37650 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
37660 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
37670 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
37680 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
37690 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
376a0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
376b0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
376c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
376d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
376e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
376f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49  ror occurs, SQLI
37700 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49  TE_NOMEM or an I
37710 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
37720 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61  returned.** as a
37730 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65  ppropriate. Othe
37740 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
37750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37760 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
37770 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
37780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37790 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
377a0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
377b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
377c0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
377d0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
377e0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
377f0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
37800 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73  ageSize);..  ass
37810 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
37820 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d   & PGHDR_MMAP)==
37830 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
37840 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
37850 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37860 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
37870 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
37880 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
37890 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
378a0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
378b0 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50  er) );..  if( nP
378c0 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
378d0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
378e0 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
378f0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
37900 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
37910 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
37920 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
37930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37940 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
37950 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
37960 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
37970 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20   int nPage = 0; 
37980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
37990 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
379a0 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
379b0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
379c0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
379d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
379e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
379f0 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
37a00 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
37a10 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
37a20 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
37a30 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  NC */..    /* Se
37a40 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53  t the doNotSyncS
37a50 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20  pill flag to 1. 
37a60 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
37a70 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
37a80 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c      ** a journal
37a90 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
37aa0 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
37ab0 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
37ac0 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73  d by.    ** this
37ad0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
37ae0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
37af0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
37b00 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
37b10 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b  tSyncSpill==0 );
37b20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
37b30 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a  otSyncSpill++;..
37b40 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
37b50 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
37b60 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
37b70 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
37b80 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
37b90 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
37ba0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
37bb0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
37bc0 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
37bd0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
37be0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
37bf0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
37c00 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
37c10 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
37c20 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
37c30 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
37c40 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74  ..    nPageCount
37c50 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
37c60 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  e;.    if( pPg->
37c70 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
37c80 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
37c90 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
37ca0 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
37cb0 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
37cc0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
37cd0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
37ce0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
37cf0 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
37d00 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
37d10 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
37d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
37d30 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
37d40 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
37d50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
37d60 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
37d70 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
37d80 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
37d90 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
37da0 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
37db0 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
37dc0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
37dd0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
37de0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
37df0 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
37e00 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
37e10 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
37e20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
37e30 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
37e40 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
37e50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37e60 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
37e70 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
37e80 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
37e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37ea0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
37eb0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
37ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
37ed0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
37ee0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
37ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
37f00 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
37f10 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
37f20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
37f30 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
37f40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
37f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37f60 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
37f70 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
37f80 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
37f90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
37fa0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
37fb0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
37fc0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
37fd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
37fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
37ff0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
38000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
38010 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
38020 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
38030 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
38040 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
38050 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
38060 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
38070 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
38080 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
38090 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
380a0 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
380b0 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
380c0 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
380d0 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
380e0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
380f0 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
38100 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
38110 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
38120 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
38130 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
38140 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
38150 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
38160 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
38170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38180 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e  TE_OK && needSyn
38190 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
381a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
381b0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
381c0 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
381d0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
381e0 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
381f0 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
38200 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
38210 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
38220 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
38230 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
38240 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
38250 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
38260 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
38270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
38280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
38290 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
382a0 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  ll==1 );.    pPa
382b0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
382c0 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ill--;.  }else{.
382d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
382e0 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
382f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
38300 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38310 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
38320 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
38330 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
38340 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
38350 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
38360 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
38370 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
38380 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
38390 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
383a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
383b0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
383c0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
383d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
383e0 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
383f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
38400 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
38410 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
38420 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
38430 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
38440 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
38450 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
38460 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
38470 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
38480 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
38490 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
384a0 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
384b0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
384c0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
384d0 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
384e0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
384f0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
38500 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
38510 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
38520 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
38530 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
38540 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
38550 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
38560 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
38570 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
38580 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
38590 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
385a0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
385b0 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70  is unused. The p
385c0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
385d0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
385e0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
385f0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
38600 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
38610 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
38620 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
38630 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74   can quadruple t
38640 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
38650 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65  e .** DELETE ope
38660 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64  rations..*/.void
38670 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
38680 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  tWrite(PgHdr *pP
38690 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
386a0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
386b0 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  r;.  if( (pPg->f
386c0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
386d0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61