/ Hex Artifact Content
Login

Artifact e53f35d61f266c47cc3883e34c7d01eaca38a71451dd72efb3cf21e043b471a7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7150: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7160: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7170: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7180: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7190: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
71a0: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71b0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71c0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71d0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7200: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7210: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7220: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7230: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7240: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7250: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7260: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7270: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
72a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72b0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72c0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72d0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72e0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72f0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
7300: 65 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72  ess */.  u8 extr
7310: 61 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  aSync;          
7320: 20 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72       /* sync dir
7330: 65 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75  ectory after jou
7340: 72 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20  rnal delete */. 
7350: 20 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67   u8 ckptSyncFlag
7360: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
7370: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
7380: 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65  YNC_FULL for che
7390: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20  ckpoint */.  u8 
73a0: 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  walSyncFlags;   
73b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43           /* SYNC
73c0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
73d0: 46 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69  FULL for wal wri
73e0: 74 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  tes */.  u8 sync
73f0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
7400: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7410: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7420: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20   otherwise */.  
7430: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
7440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
7450: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
7460: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74  mporary or immut
7470: 61 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  able file */.  u
7480: 38 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  8 noLock;       
7490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
74a0: 20 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70   not lock (excep
74b0: 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a  t in WAL mode) *
74c0: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
74f0: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
7500: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
7530: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
7540: 4f 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a  O */..  /*******
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7590: 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c  ***.  ** The fol
75a0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
75b0: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
75c0: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63  s members that c
75d0: 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a  hange during.  *
75e0: 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74  * routine operat
75f0: 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62  ion.  Class memb
7600: 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20  ers not in this 
7610: 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72  block are either
7620: 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e   fixed.  ** when
7630: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69   the pager is fi
7640: 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65  rst created or e
7650: 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20  lse only change 
7660: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a  when there is a.
7670: 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74    ** significant
7680: 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75   mode change (su
7690: 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74  ch as changing t
76a0: 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f  he page_size, lo
76b0: 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a  cking_mode,.  **
76c0: 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f   or the journal_
76d0: 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f  mode).  From ano
76e0: 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65  ther view, these
76f0: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64   class members d
7700: 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65  escribe.  ** the
7710: 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20   "state" of the 
7720: 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68  pager, while oth
7730: 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  er class members
7740: 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20   describe the.  
7750: 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f  ** "configuratio
7760: 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  n" of the pager.
7770: 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74  .  */.  u8 eStat
7780: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7790: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61      /* Pager sta
77a0: 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52  te (OPEN, READER
77b0: 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e  , WRITER_LOCKED.
77c0: 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b  .) */.  u8 eLock
77d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
77e0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
77f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61  ock held on data
7800: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
7810: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
7820: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
7830: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
7840: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
7850: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
7860: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
7870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7880: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
7890: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
78a0: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
78b0: 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20  doNotSpill;     
78c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
78d0: 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  ot spill the cac
78e0: 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f  he when non-zero
78f0: 20 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d   */.  u8 subjInM
7900: 65 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  emory;          
7910: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7920: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
7930: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20  ournals */.  u8 
7940: 62 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20  bUseFetch;      
7950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7960: 20 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29   to use xFetch()
7970: 20 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64   */.  u8 hasHeld
7980: 53 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20  SharedLock;     
7990: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73    /* True if a s
79a0: 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65  hared lock has e
79b0: 76 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f  ver been held */
79c0: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
79e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
79f0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7a00: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7a10: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
7a20: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
7a30: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
7a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
7a50: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
7a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7a70: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7a80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7a90: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7aa0: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7ab0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7ac0: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7ad0: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7ae0: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b00: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7b10: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
7b20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
7b50: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
7b60: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
7b70: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7b80: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7b90: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7ba0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7bb0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7bc0: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7be0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7bf0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7c00: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7c10: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
7c20: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
7c30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
7c40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
7c50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7c60: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7c70: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7c80: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7c90: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7ca0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7cb0: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7cc0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7cd0: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7ce0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7cf0: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7d00: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7d10: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7d20: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7d30: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7d40: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7d50: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7d60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7d70: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7d80: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7d90: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7da0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7db0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7dc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7dd0: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7de0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7df0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7e00: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7e10: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7e20: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7e30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7e40: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7e50: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7e60: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7e70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7e80: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7e90: 6e 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44  nt[] */.  u32 iD
7ea0: 61 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20  ataVersion;     
7eb0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7ec0: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7ed0: 73 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67  se content chang
7ee0: 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  es */.  char dbF
7ef0: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
7f00: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
7f10: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
7f20: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
7f30: 0a 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74  ..  int nMmapOut
7f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7f50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61  /* Number of mma
7f60: 70 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  p pages currentl
7f70: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f  y outstanding */
7f80: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
7f90: 20 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f   szMmap;       /
7fa0: 2a 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75  * Desired maximu
7fb0: 6d 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20  m mmap size */. 
7fc0: 20 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65   PgHdr *pMmapFre
7fd0: 65 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20  elist;       /* 
7fe0: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61  List of free mma
7ff0: 70 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28  p page headers (
8000: 70 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a  pDirty) */.  /*.
8010: 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    ** End of the 
8020: 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69  routinely-changi
8030: 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  ng class members
8040: 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  *************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
8090: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80b0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
80c0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
80d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
80e0: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8100: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
8110: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
8120: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
8130: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
8160: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
8170: 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a  .  u32 sectorSiz
8180: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
8190: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
81a0: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
81b0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  lback */.  int p
81c0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
81d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
81e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
81f0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  age */.  Pgno mx
8200: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
8210: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
8220: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
8230: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
8240: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
8250: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
8260: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
8270: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
8280: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68  al files */.  ch
8290: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
82a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
82b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
82c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
82d0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
82e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
82f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
8300: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ile */.  int (*x
8310: 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
8320: 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  d*); /* Function
8330: 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75   to call when bu
8340: 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  sy */.  void *pB
8350: 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20  usyHandlerArg;  
8360: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61      /* Context a
8370: 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73  rgument for xBus
8380: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e  yHandler */.  in
8390: 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20  t aStat[3];     
83a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
83b0: 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d  al cache hits, m
83c0: 69 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73  isses and writes
83d0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
83e0: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65  E_TEST.  int nRe
83f0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
8400: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
8410: 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23   pages read */.#
8420: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
8430: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
8440: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
8450: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
8460: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
8470: 0a 20 20 69 6e 74 20 28 2a 78 47 65 74 29 28 50  .  int (*xGet)(P
8480: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
8490: 65 2a 2a 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  e**,int); /* Rou
84a0: 74 69 6e 65 20 74 6f 20 66 65 74 63 68 20 61 20  tine to fetch a 
84b0: 70 61 74 63 68 20 2a 2f 0a 23 69 66 64 65 66 20  patch */.#ifdef 
84c0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
84d0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
84e0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
84f0: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8500: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8510: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8520: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8530: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8540: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
8550: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
8560: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
8570: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
8580: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
8590: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
85a0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
85b0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
85d0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
85e0: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
85f0: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8600: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8620: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8630: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8640: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
8650: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
8660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8670: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
8680: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
8690: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
86a0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
86b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
86c0: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
86d0: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
86e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
86f0: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8710: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8720: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8730: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  log */.#endif.#i
8740: 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
8750: 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 53 65 72  ER_EDITION.  Ser
8760: 76 65 72 20 2a 70 53 65 72 76 65 72 3b 0a 20 20  ver *pServer;.  
8770: 53 65 72 76 65 72 50 61 67 65 20 2a 70 53 65 72  ServerPage *pSer
8780: 76 65 72 50 61 67 65 3b 0a 23 65 6e 64 69 66 0a  verPage;.#endif.
8790: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65  };../*.** Indexe
87a0: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 50  s for use with P
87b0: 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68  ager.aStat[]. Th
87c0: 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20  e Pager.aStat[] 
87d0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  array contains.*
87e0: 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63 63  * the values acc
87f0: 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e 67  essed by passing
8800: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
8810: 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48  _CACHE_HIT, CACH
8820: 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41  E_MISS .** or CA
8830: 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c  CHE_WRITE to sql
8840: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29  ite3_db_status()
8850: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
8860: 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a  ER_STAT_HIT   0.
8870: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8880: 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69  AT_MISS  1.#defi
8890: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52  ne PAGER_STAT_WR
88a0: 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ITE 2../*.** The
88b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
88c0: 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64  l variables hold
88d0: 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66   counters used f
88e0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75  or.** testing pu
88f0: 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68  rposes only.  Th
8900: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f  ese variables do
8910: 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a   not exist in.**
8920: 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62   a non-testing b
8930: 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72  uild.  These var
8940: 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74  iables are not t
8950: 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23  hread-safe..*/.#
8960: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8970: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  T.int sqlite3_pa
8980: 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
8990: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
89a0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
89b0: 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f   read from DB */
89c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
89d0: 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
89e0: 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
89f0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8a00: 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f  written to DB */
8a10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8a20: 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20  er_writej_count 
8a30: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8a40: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
8a50: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
8a60: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8a70: 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c  INCR(v)  v++.#el
8a80: 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  se.# define PAGE
8a90: 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66  R_INCR(v).#endif
8aa0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  ..../*.** Journa
8ab0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
8ac0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
8ad0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
8ae0: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
8af0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
8b00: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
8b10: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
8b20: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
8b30: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
8b40: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
8b50: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8b60: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
8b70: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
8b80: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
8b90: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
8ba0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
8bb0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a  ournal is being.
8bc0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
8bd0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
8be0: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
8bf0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
8c00: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
8c10: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
8c20: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
8c30: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
8c40: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
8c50: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
8c60: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
8c70: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
8c80: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
8c90: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
8ca0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
8cb0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
8cc0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
8cd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
8ce0: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
8cf0: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
8d00: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8d10: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
8d20: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
8d30: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
8d40: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
8d50: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
8d60: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
8d70: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
8d80: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8d90: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
8da0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
8db0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
8dc0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
8dd0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
8de0: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
8df0: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
8e00: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
8e10: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
8e20: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
8e30: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
8e40: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
8e50: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
8e60: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
8e70: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
8e80: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
8e90: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
8ea0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
8eb0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
8ec0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
8ed0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
8ee0: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
8ef0: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
8f00: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
8f10: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
8f20: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
8f30: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
8f40: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
8f50: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
8f60: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
8f70: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
8f80: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
8f90: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
8fa0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
8fb0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
8fc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8fd0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
8fe0: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
8ff0: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
9000: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
9010: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
9020: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
9030: 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  the of each page
9040: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a   record in the j
9050: 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20  ournal is given 
9060: 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  by.** the follow
9070: 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64  ing macro..*/.#d
9080: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
9090: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
90a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
90b0: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
90c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
90d0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
90e0: 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75  ger. This is usu
90f0: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a  ally the same .*
9100: 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67  * size as a sing
9110: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
9120: 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74  See also setSect
9130: 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65  orSize()..*/.#de
9140: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
9150: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
9160: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
9170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
9180: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
9190: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
91a0: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
91b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
91c0: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
91d0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
91e0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
91f0: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
9200: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
9210: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
9220: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
9230: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
9240: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
9250: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
9260: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
9270: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
9280: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
9290: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
92a0: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
92b0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
92c0: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
92d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
92e0: 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74 72  o USEFETCH is tr
92f0: 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c  ue if we are all
9300: 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65 20  owed to use the 
9310: 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65  xFetch and xUnfe
9320: 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  tch.** interface
9330: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
9340: 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d  database using m
9350: 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
9360: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
9370: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
9380: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
9390: 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46  H(x) ((x)->bUseF
93a0: 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65  etch).#else.# de
93b0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
93c0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
93d0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
93e0: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
93f0: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
9400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
9410: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
9420: 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  47../*.** The ar
9430: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
9440: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
9450: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
9460: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
9470: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
9480: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
9490: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
94a0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
94b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
94c0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
94d0: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
94e0: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
94f0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9500: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
9510: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
9520: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
9530: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
9540: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
9550: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
9560: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d  pFd)->pMethods!=
9570: 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)../*.** Return
9580: 20 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61   true if this pa
9590: 67 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65  ger uses a write
95a0: 2d 61 68 65 61 64 20 6c 6f 67 20 74 6f 20 72 65  -ahead log to re
95b0: 61 64 20 70 61 67 65 20 70 67 6e 6f 2e 0a 2a 2a  ad page pgno..**
95c0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
95d0: 20 74 68 65 20 70 61 67 65 72 20 72 65 61 64 73   the pager reads
95e0: 20 70 67 6e 6f 20 64 69 72 65 63 74 6c 79 20 66   pgno directly f
95f0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
9600: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
9610: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
9620: 4c 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  L) && defined(SQ
9630: 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
9640: 46 4c 4f 57 5f 52 45 41 44 29 0a 69 6e 74 20 73  FLOW_READ).int s
9650: 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61  qlite3PagerUseWa
9660: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
9670: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 75   Pgno pgno){.  u
9680: 33 32 20 69 52 65 61 64 20 3d 20 30 3b 0a 20 20  32 iRead = 0;.  
9690: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
96a0: 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 20  ager->pWal==0 ) 
96b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
96c0: 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
96d0: 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
96e0: 6c 2c 20 70 67 6e 6f 2c 20 26 69 52 65 61 64 29  l, pgno, &iRead)
96f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 7c 7c  ;.  return rc ||
9700: 20 69 52 65 61 64 3b 0a 7d 0a 23 65 6e 64 69 66   iRead;.}.#endif
9710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9720: 4f 4d 49 54 5f 57 41 4c 0a 23 20 64 65 66 69 6e  OMIT_WAL.# defin
9730: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
9740: 20 28 28 78 29 2d 3e 70 57 61 6c 21 3d 30 29 0a   ((x)->pWal!=0).
9750: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
9760: 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a  agerUseWal(x) 0.
9770: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f  # define pagerRo
9780: 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23  llbackWal(x) 0.#
9790: 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c   define pagerWal
97a0: 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29 20  Frames(v,w,x,y) 
97b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
97c0: 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
97d0: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 20  (z) SQLITE_OK.# 
97e0: 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67 69  define pagerBegi
97f0: 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
9800: 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (z) SQLITE_OK.#e
9810: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
9820: 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49  ITE_SERVER_EDITI
9830: 4f 4e 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  ON.# define page
9840: 72 49 73 53 65 72 76 65 72 28 78 29 20 28 28 78  rIsServer(x) ((x
9850: 29 2d 3e 70 53 65 72 76 65 72 21 3d 30 29 0a 23  )->pServer!=0).#
9860: 20 64 65 66 69 6e 65 20 70 61 67 65 72 49 73 50   define pagerIsP
9870: 72 6f 63 65 73 73 53 65 72 76 65 72 28 78 29 20  rocessServer(x) 
9880: 73 71 6c 69 74 65 33 53 65 72 76 65 72 49 73 53  sqlite3ServerIsS
9890: 69 6e 67 6c 65 50 72 6f 63 65 73 73 28 28 78 29  ingleProcess((x)
98a0: 2d 3e 70 53 65 72 76 65 72 29 0a 23 65 6c 73 65  ->pServer).#else
98b0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 49  .# define pagerI
98c0: 73 53 65 72 76 65 72 28 78 29 20 30 0a 23 65 6e  sServer(x) 0.#en
98d0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  dif..#ifndef NDE
98e0: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
98f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
9900: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
9910: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
9920: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
9930: 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20 61 73  ion runs many as
9940: 73 65 72 74 73 20 74 6f 20 74 72 79 20 74 6f 20  serts to try to 
9950: 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e  find inconsisten
9960: 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69  cies in.** the i
9970: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
9980: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
9990: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
99a0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
99b0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
99c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
99d0: 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   p;..  /* State 
99e0: 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e 20 2a  must be valid. *
99f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  /.  assert( p->e
9a00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
9a10: 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  N.       || p->e
9a20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
9a30: 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  DER.       || p-
9a40: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a50: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
9a60: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9a70: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
9a80: 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
9a90: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9aa0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a  ER_WRITER_DBMOD.
9ab0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9ac0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9ad0: 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20 20 20  R_FINISHED.     
9ae0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9af0: 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b  PAGER_ERROR.  );
9b00: 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c 65 73  ..  /* Regardles
9b10: 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
9b20: 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70 2d 66   state, a temp-f
9b30: 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ile connection a
9b40: 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a 20 20  lways behaves.  
9b50: 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61 73 20  ** as if it has 
9b60: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
9b70: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9b80: 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76 65 72  e file. It never
9b90: 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20 74 68   updates.  ** th
9ba0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
9bb0: 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65 20 63   field, so the c
9bc0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
9bd0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
9be0: 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
9bf0: 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ( p->tempFile==0
9c00: 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58   || p->eLock==EX
9c10: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d    assert( p->tem
9c30: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
9c40: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
9c50: 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  one );..  /* If 
9c60: 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66  the useJournal f
9c70: 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
9c80: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d  e journal-mode m
9c90: 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20 0a 20  ust be "OFF". . 
9ca0: 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 6a   ** And if the j
9cb0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22  ournal-mode is "
9cc0: 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61  OFF", the journa
9cd0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20  l file must not 
9ce0: 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20  be open..  */.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29   p->useJournal )
9d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a  ;.  assert( p->j
9d40: 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
9d50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
9d60: 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e  F || !isOpen(p->
9d70: 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  jfd) );..  /* Ch
9d80: 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42 20 69  eck that MEMDB i
9d90: 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41  mplies noSync. A
9da0: 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nd an in-memory 
9db0: 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a  journal. Since .
9dc0: 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e 73 20    ** this means 
9dd0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
9de0: 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49  er performs no I
9df0: 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e  O at all, it can
9e00: 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20  not encounter . 
9e10: 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c 49 54   ** either SQLIT
9e20: 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
9e30: 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f  E_FULL during ro
9e40: 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c 65 20  llback or while 
9e50: 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a  finalizing .  **
9e60: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9e70: 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65 20 69   (although the i
9e80: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9e90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
9ea0: 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e  may .  ** return
9eb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
9ec0: 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  MEM while the jo
9ed0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
9ee0: 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20 49 74  ing written). It
9ef0: 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72 65 66   .  ** is theref
9f00: 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  ore not possible
9f10: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
9f20: 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  y pager to enter
9f30: 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a   the ERROR .  **
9f40: 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69   state..  */.  i
9f50: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
9f60: 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
9f70: 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 61 73  p->fd) );.    as
9f80: 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20  sert( p->noSync 
9f90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9fa0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9fb0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9fc0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c  _OFF .         |
9fd0: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
9fe0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9ff0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
a000: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a010: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
a020: 45 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61  ERROR && p->eSta
a030: 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
a040: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
a050: 67 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20  gerUseWal(p)==0 
a060: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
a070: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
a080: 69 73 20 73 65 74 2c 20 61 20 52 45 53 45 52 56  is set, a RESERV
a090: 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ED lock or great
a0a0: 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  er must be held.
a0b0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65    ** on the file
a0c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
a0d0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
a0e0: 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70  ountDone==0 || p
a0f0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  Pager->eLock>=RE
a100: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
a110: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a120: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
a130: 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d  );..  switch( p-
a140: 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63  >eState ){.    c
a150: 61 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a  ase PAGER_OPEN:.
a160: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
a170: 45 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73  EMDB );.      as
a180: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a190: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a1c0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a1d0: 70 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70  pPCache)==0 || p
a1e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
a1f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a200: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a210: 52 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73  READER:.      as
a220: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a230: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a240: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a250: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a260: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a280: 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
a290: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2a0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2b0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20  WRITER_LOCKED:. 
a2c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a2d0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
a2e0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a2f0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a300: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a310: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
a320: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a330: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a340: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a350: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a370: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a380: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a390: 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
a3a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a3b0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a3c0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
a3d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a3e0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a3f0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a400: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a410: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a420: 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
a430: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a440: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a450: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a  RITER_CACHEMOD:.
a460: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a470: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
a480: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a490: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a4a0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a4b0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
a4e0: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
a4f0: 74 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f  that if journal_
a500: 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68  mode=wal here th
a510: 61 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20  at neither the. 
a520: 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
a530: 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57  l file nor the W
a540: 41 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e  AL file are open
a550: 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64  . This happens d
a560: 75 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  uring.        **
a570: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e   a rollback tran
a580: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69  saction that swi
a590: 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e  tches from journ
a5a0: 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20  al_mode=off.    
a5b0: 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61      ** to journa
a5c0: 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20  l_mode=wal..    
a5d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
a5e0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a5f0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
a600: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a610: 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29  ( isOpen(p->jfd)
a620: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
a630: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a640: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a650: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a660: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a670: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a680: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a690: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
a6a0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
a6b0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a6c0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a6d0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a6e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a6f0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a700: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a720: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a730: 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20  WRITER_DBMOD:.  
a740: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a750: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a760: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a770: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a780: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a790: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a7a0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a7b0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a7c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a7d0: 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  >=EXCLUSIVE_LOCK
a7e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a7f0: 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29  ( isOpen(p->jfd)
a800: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a810: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a820: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a830: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a840: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a850: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a860: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a870: 20 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74         || (sqlit
a880: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
a890: 74 65 72 69 73 74 69 63 73 28 70 2d 3e 66 64 29  teristics(p->fd)
a8a0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41  &SQLITE_IOCAP_BA
a8b0: 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 20 20  TCH_ATOMIC).    
a8c0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
a8d0: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a8e0: 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64  gSize<=pPager->d
a8f0: 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  bHintSize );.   
a900: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a910: 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52  ase PAGER_WRITER
a920: 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20  _FINISHED:.     
a930: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a940: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
a950: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a960: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a970: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
a990: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a9a0: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  er) );.      ass
a9b0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a9c0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a9d0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a9e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a9f0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
aa00: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
aa10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aa20: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
aa30: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
aa40: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
aa50: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
aa60: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
aa70: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
aa80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72       );.      br
aa90: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
aaa0: 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20  AGER_ERROR:.    
aab0: 20 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20    /* There must 
aac0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
aad0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
aae0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
aaf0: 65 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69  er if.      ** i
ab00: 6e 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f  n ERROR state. O
ab10: 74 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67  therwise the pag
ab20: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  er should have a
ab30: 6c 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20  lready dropped. 
ab40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
ab50: 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20  OPEN state..    
ab60: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
ab70: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
ab80: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
ab90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
aba0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
abb0: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
abc0: 61 63 68 65 29 3e 30 20 7c 7c 20 70 50 61 67 65  ache)>0 || pPage
abd0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
abe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
abf0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
ac00: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
ac10: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
ac20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
ac30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
ac40: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
ac50: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
ac60: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
ac70: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
ac80: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
ac90: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
aca0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
acb0: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
acc0: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
acd0: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
ace0: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
acf0: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
ad00: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
ad10: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
ad20: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
ad30: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
ad40: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
ad50: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
ad60: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
ad70: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
ad80: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
ad90: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
ada0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
adb0: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
adc0: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
add0: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
ade0: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
adf0: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
ae00: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
ae10: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
ae20: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
ae30: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
ae40: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
ae50: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
ae70: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
ae80: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
ae90: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
aea0: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
aeb0: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
aec0: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
aed0: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
aee0: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
aef0: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
af00: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
af10: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
af20: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
af30: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
af40: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
af50: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
af60: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
af70: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
af80: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
af90: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
afa0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
afb0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
afc0: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
afd0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
afe0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
aff0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
b000: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
b010: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
b020: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
b030: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
b040: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
b050: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
b060: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b070: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
b080: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
b090: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
b0a0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b0b0: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
b0c0: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
b0d0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b0e0: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
b0f0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
b100: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
b110: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
b120: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
b130: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
b140: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
b150: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
b160: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
b170: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
b180: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
b190: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
b1a0: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
b1b0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b1c0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
b1d0: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
b1e0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b1f0: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
b200: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
b210: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
b220: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
b230: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b240: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
b250: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
b260: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b270: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b280: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
b290: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
b2a0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b2b0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b2c0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
b2d0: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
b2e0: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
b2f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
b300: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
b310: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
b320: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
b330: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
b340: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
b350: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
b360: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
b370: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
b380: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
b390: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
b3a0: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
b3b0: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
b3c0: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
b3d0: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
b3e0: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
b3f0: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
b400: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
b410: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
b420: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
b430: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
b440: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
b450: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
b460: 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
b470: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
b480: 68 65 20 76 61 72 69 6f 75 73 20 70 61 67 65 20  he various page 
b490: 67 65 74 74 65 72 73 20 2a 2f 0a 73 74 61 74 69  getters */.stati
b4a0: 63 20 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72  c int getPageNor
b4b0: 6d 61 6c 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c  mal(Pager*,Pgno,
b4c0: 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73  DbPage**,int);.s
b4d0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
b4e0: 65 45 72 72 6f 72 28 50 61 67 65 72 2a 2c 50 67  eError(Pager*,Pg
b4f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
b500: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
b510: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
b520: 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d  tic int getPageM
b530: 4d 61 70 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c  Map(Pager*,Pgno,
b540: 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23  DbPage**,int);.#
b550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
b560: 20 74 68 65 20 50 61 67 65 72 2e 78 47 65 74 20   the Pager.xGet 
b570: 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65 20 61  method for the a
b580: 70 70 72 6f 70 72 69 61 74 65 20 72 6f 75 74 69  ppropriate routi
b590: 6e 65 20 75 73 65 64 20 74 6f 20 66 65 74 63 68  ne used to fetch
b5a0: 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  .** content from
b5b0: 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 73   the pager..*/.s
b5c0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 47 65  tatic void setGe
b5d0: 74 74 65 72 4d 65 74 68 6f 64 28 50 61 67 65 72  tterMethod(Pager
b5e0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
b5f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b600: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b610: 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 45 72  xGet = getPageEr
b620: 72 6f 72 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ror;.#if SQLITE_
b630: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
b640: 20 20 7d 65 6c 73 65 20 69 66 28 20 55 53 45 46    }else if( USEF
b650: 45 54 43 48 28 70 50 61 67 65 72 29 0a 23 69 66  ETCH(pPager).#if
b660: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45  def SQLITE_SERVE
b670: 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20 26 26 20  R_EDITION.   && 
b680: 73 71 6c 69 74 65 33 53 65 72 76 65 72 49 73 52  sqlite3ServerIsR
b690: 65 61 64 6f 6e 6c 79 28 70 50 61 67 65 72 2d 3e  eadonly(pPager->
b6a0: 70 53 65 72 76 65 72 29 3d 3d 30 0a 23 65 6e 64  pServer)==0.#end
b6b0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
b6c0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26  _HAS_CODEC.   &&
b6d0: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
b6e0: 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20  =0.#endif.  ){. 
b6f0: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
b700: 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23  = getPageMMap;.#
b710: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b720: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
b730: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
b740: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b750: 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20  etPageNormal;.  
b760: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
b770: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20  n true if it is 
b780: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
b790: 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74  te page *pPg int
b7a0: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
b7b0: 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65  l..** A page nee
b7c0: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
b7d0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b7e0: 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65  urnal if there e
b7f0: 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20  xists one.** or 
b800: 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  more open savepo
b810: 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a  ints for which:.
b820: 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61  **.**   * The pa
b830: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge-number is les
b840: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
b850: 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  to PagerSavepoin
b860: 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20  t.nOrig, and.** 
b870: 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72    * The bit corr
b880: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
b890: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b8a0: 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20  not set in.**   
b8b0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
b8c0: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a  .pInSavepoint..*
b8d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
b8e0: 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67  jRequiresPage(Pg
b8f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
b900: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
b910: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65  ->pPager;.  Page
b920: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20  rSavepoint *p;. 
b930: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b940: 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b  ->pgno;.  int i;
b950: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
b960: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
b970: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
b980: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
b990: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
b9a0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
b9b0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
b9c0: 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d  ecTestNotNull(p-
b9d0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
b9e0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
b9f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ba00: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ba10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ba20: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
ba30: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
ba40: 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
ba50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ba60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
ba70: 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50   pageInJournal(P
ba80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
ba90: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
baa0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
bab0: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
bac0: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
bad0: 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  gno);.}.#endif..
bae0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
baf0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
bb00: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bb10: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
bb20: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
bb30: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
bb40: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
bb50: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
bb60: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
bb70: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
bb80: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
bb90: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
bba0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
bbb0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
bbc0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
bbd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
bbe0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
bbf0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
bc00: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
bc10: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
bc20: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
bc30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
bc40: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
bc50: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
bc60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
bc70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
bc80: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
bc90: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
bca0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bcb0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
bcc0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
bcd0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
bce0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
bcf0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
bd00: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
bd10: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
bd20: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
bd30: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
bd40: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
bd50: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
bd60: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
bd70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
bd80: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
bd90: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
bda0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
bdb0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
bdc0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
bdd0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
bde0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
bdf0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
be00: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
be10: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
be20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
be30: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
be40: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
be50: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
be60: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
be70: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
be80: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
be90: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
bea0: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
beb0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
bec0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
bed0: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
bee0: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
bef0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
bf00: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
bf10: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
bf20: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
bf30: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
bf40: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
bf50: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
bf60: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
bf70: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
bf80: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
bf90: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
bfa0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bfb0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
bfc0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
bfd0: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
bfe0: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bff0: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
c000: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c010: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
c020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c030: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
c040: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c050: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
c060: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
c070: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
c080: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
c090: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
c0a0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
c0b0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
c0c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
c0d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c0e0: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c0f0: 7c 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  | pagerIsServer(
c100: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
c110: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
c120: 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
c130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
c140: 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock>=eLock );.  
c150: 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e    rc = pPager->n
c160: 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f  oLock ? SQLITE_O
c170: 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  K : sqlite3OsUnl
c180: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c190: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
c1a0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55  pPager->eLock!=U
c1b0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
c1c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
c1d0: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
c1e0: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
c1f0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64  E(("UNLOCK %p %d
c200: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f  \n", pPager, eLo
c210: 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck)).  }.  retur
c220: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
c230: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
c240: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
c250: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
c260: 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52 45   be either SHARE
c270: 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52  D_LOCK,.** RESER
c280: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
c290: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74  USIVE_LOCK. If t
c2a0: 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63  he caller is suc
c2b0: 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
c2c0: 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  .** Pager.eLock 
c2d0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
c2e0: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c2f0: 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  e. .**.** Except
c300: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
c310: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
c320: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
c330: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  s function is .*
c340: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
c350: 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73   modify it unles
c360: 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  s the new lockin
c370: 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c 55  g state is EXCLU
c380: 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53  SIVE_LOCK. .** S
c390: 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
c3a0: 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
c3b0: 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   of UNKNOWN_LOCK
c3c0: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
c3d0: 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e  ion .** of this.
c3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c3f0: 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72  agerLockDb(Pager
c400: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
c410: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
c420: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
c430: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48  ssert( eLock==SH
c440: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ARED_LOCK || eLo
c450: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
c460: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c  K || eLock==EXCL
c470: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
c480: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
c490: 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65  k<eLock || pPage
c4a0: 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
c4b0: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  N_LOCK ){.    rc
c4c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
c4d0: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
c4e0: 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
c4f0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c500: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c510: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67  LITE_OK && (pPag
c520: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
c530: 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d  WN_LOCK||eLock==
c540: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20  EXCLUSIVE_LOCK) 
c550: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
c560: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
c570: 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
c580: 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
c590: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
c5a0: 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
c5b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c5c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c5d0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
c5e0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
c5f0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a  tomic-write or.*
c600: 2a 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77  * atomic-batch-w
c610: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
c620: 6e 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ns can be used w
c630: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
c640: 54 68 65 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  The.** atomic-wr
c650: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
c660: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
c670: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
c680: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
c690: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
c6a0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
c6b0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
c6c0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
c6d0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
c6e0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
c6f0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
c700: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c710: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
c720: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
c730: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
c740: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
c750: 2a 0a 2a 2a 20 49 66 20 69 74 20 63 61 6e 20 62  *.** If it can b
c760: 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65  e used, then the
c770: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c780: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
c790: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66  he journal .** f
c7a0: 69 6c 65 20 77 68 65 6e 20 69 74 20 63 6f 6e 74  ile when it cont
c7b0: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
c7c0: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
c7d0: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ne page..**.** T
c7e0: 68 65 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d  he atomic-batch-
c7f0: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
c800: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
c810: 66 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  f OsDeviceCharac
c820: 74 65 72 69 73 74 69 63 73 28 29 0a 2a 2a 20 72  teristics().** r
c830: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 77  eturns a value w
c840: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 49  ith the SQLITE_I
c850: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
c860: 43 20 62 69 74 20 73 65 74 2e 20 2d 31 20 69 73  C bit set. -1 is
c870: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
c880: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
c890: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 70 74 69   If neither opti
c8a0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
c8b0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
c8c0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
c8d0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
c8e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
c8f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
c900: 44 42 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  DB );..#if defin
c910: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c920: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c  _ATOMIC_WRITE) \
c930: 0a 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  . || defined(SQL
c940: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
c950: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
c960: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c990: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c9a0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
c9b0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c9c0: 0a 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  dc = sqlite3O
c9d0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c9e0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c9f0: 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  d);.#endif..#ifd
ca00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ca10: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
ca20: 49 54 45 0a 20 20 69 66 28 20 64 63 26 53 51 4c  ITE.  if( dc&SQL
ca30: 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
ca40: 41 54 4f 4d 49 43 20 29 7b 0a 20 20 20 20 72 65  ATOMIC ){.    re
ca50: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  turn -1;.  }.#en
ca60: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
ca70: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
ca80: 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20 69  _WRITE.  {.    i
ca90: 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61  nt nSector = pPa
caa0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
cab0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20  .    int szPage 
cac0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
cad0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
cae0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
caf0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
cb00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
cb10: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
cb20: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
cb30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
cb40: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
cb50: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
cb60: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
cb70: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
cb80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
cb90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
cba0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
cbb0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
cbc0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23 65  G_SZ(pPager);.#e
cbd0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 30  ndif..  return 0
cbe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
cbf0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
cc00: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
cc10: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
cc20: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
cc30: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
cc40: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
cc50: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
cc60: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
cc70: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
cc80: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
cc90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
cca0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ccb0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
ccc0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
ccd0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
cce0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
ccf0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
cd00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
cd10: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
cd20: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
cd30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
cd40: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
cd50: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
cd60: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
cd70: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
cd80: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
cd90: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
cda0: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
cdb0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
cdc0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
cdd0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
cde0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
cdf0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
ce00: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
ce10: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
ce20: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
ce30: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
ce40: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
ce50: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
ce60: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
ce70: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
ce80: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
ce90: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
cea0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
ceb0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
cec0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
ced0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
cee0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
cef0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
cf00: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
cf10: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
cf20: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
cf30: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
cf40: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
cf50: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
cf60: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
cf70: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
cf80: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
cf90: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
cfa0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
cfb0: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
cfc0: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
cfd0: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
cfe0: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
cff0: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
d000: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
d010: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
d020: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
d030: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
d040: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
d050: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
d060: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
d070: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
d080: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
d090: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
d0a0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
d0b0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
d0c0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
d0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d0e0: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
d0f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
d100: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d110: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
d120: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d130: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
d140: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
d150: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
d160: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
d170: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
d180: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
d190: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
d1a0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
d1b0: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
d1c0: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
d1d0: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
d1e0: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
d1f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d200: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
d210: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
d220: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
d230: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
d240: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
d250: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
d260: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
d270: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
d280: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
d290: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
d2a0: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
d2b0: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
d2c0: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
d2d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d2e0: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
d2f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
d300: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
d310: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
d320: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
d330: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
d340: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d350: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
d360: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
d370: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d380: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
d390: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
d3a0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
d3b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d3c0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
d3d0: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
d3e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
d3f0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
d400: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
d410: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
d420: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
d430: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
d440: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
d450: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
d460: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
d470: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
d480: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
d490: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
d4a0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
d4b0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
d4c0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
d4d0: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
d4e0: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
d4f0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
d500: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
d510: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d520: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
d530: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d540: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
d550: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
d560: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
d570: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
d580: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
d590: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
d5a0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
d5b0: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
d5c0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
d5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d5e0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
d5f0: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
d600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
d610: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
d620: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d630: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
d640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d650: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
d660: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
d670: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
d680: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
d6b0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
d6c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
d6d0: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
d6f0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
d700: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
d710: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
d720: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
d730: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
d740: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
d750: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
d760: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
d770: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
d780: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
d790: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
d7a0: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
d7b0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d7c0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d7d0: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
d7e0: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
d7f0: 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20    || len==0 .   
d800: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d810: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d820: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
d830: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
d840: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d850: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
d860: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
d870: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
d880: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
d890: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
d8a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d8b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d8c0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
d8d0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
d8e0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
d8f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d900: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
d910: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
d920: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d930: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
d940: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
d950: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
d960: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
d970: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
d980: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
d990: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
d9a0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
d9b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
d9c0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
d9d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
d9e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d9f0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
da00: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
da10: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
da20: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
da30: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
da40: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
da50: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
da60: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
da70: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
da80: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
da90: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
daa0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
dab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
dad0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
dae0: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
daf0: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
db00: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
db10: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
db20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
db30: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
db40: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
db50: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
db60: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
db70: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
db80: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
db90: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
dba0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
dbb0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
dbc0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
dbf0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
dc00: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
dc10: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
dc20: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
dc30: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
dc50: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
dc80: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
dc90: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
dca0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
dcb0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
dcc0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
dcd0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
dce0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
dcf0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
dd00: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
dd10: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
dd20: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
dd30: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
dd40: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
dd50: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
dd60: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
dd70: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
dd80: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
dd90: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
dda0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
ddb0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
ddc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
ddd0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
dde0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
ddf0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
de00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
de10: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
de20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
de30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
de40: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
de50: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
de60: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
de70: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
de80: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
de90: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
dea0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
deb0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
dec0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
ded0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
dee0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
def0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
df00: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
df10: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
df20: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
df30: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
df40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
df50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
df60: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
df70: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
df80: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
df90: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
dfa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
dfb0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
dfc0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
dfd0: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
dfe0: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
dff0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
e000: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
e010: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
e020: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
e030: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
e040: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
e050: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
e060: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
e070: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
e080: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
e090: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
e0a0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
e0b0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
e0c0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
e0d0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
e0e0: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
e0f0: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
e100: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
e110: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
e120: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
e130: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
e140: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
e150: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
e160: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
e170: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
e180: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
e190: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
e1a0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
e1b0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
e1c0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
e1d0: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
e1e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e210: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e220: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e230: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
e240: 20 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74    assert( !sqlit
e250: 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
e260: 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ory(pPager->jfd)
e270: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
e280: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
e290: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
e2a0: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
e2b0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
e2c0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
e2d0: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
e2e0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
e2f0: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
e300: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
e310: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
e320: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
e330: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e340: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
e350: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
e360: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
e370: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
e380: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
e390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e3a0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
e3b0: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
e3c0: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
e3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e3e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e3f0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
e400: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e410: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
e420: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
e430: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
e440: 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
e450: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e460: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
e470: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
e480: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
e490: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
e4a0: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
e4b0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
e4c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
e4d0: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
e4e0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
e4f0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
e500: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
e510: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
e520: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
e530: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
e540: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
e550: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
e560: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
e570: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
e580: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
e590: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
e5a0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
e5b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e5c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e5d0: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
e5e0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
e5f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e600: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
e610: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
e620: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e630: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
e640: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e650: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
e660: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
e670: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
e680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e690: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e6a0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
e6b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
e6c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
e6d0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
e6e0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
e6f0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
e700: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
e710: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e720: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
e730: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
e740: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
e750: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
e760: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
e770: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
e780: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
e790: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
e7a0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
e7b0: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
e7c0: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
e7d0: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
e7e0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
e7f0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
e800: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
e810: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
e820: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
e830: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
e840: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
e850: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
e860: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
e870: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
e880: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
e890: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
e8a0: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
e8b0: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
e8c0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
e8d0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
e8e0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
e8f0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
e900: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
e910: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
e920: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e930: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
e940: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e950: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
e960: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
e970: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
e980: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
e990: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
e9a0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
e9b0: 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32  2 nHeader = (u32
e9c0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
e9d0: 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66  e;/* Size of buf
e9e0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
e9f0: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
ea00: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
ea30: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
ea40: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
ea50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea70: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ea80: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
ea90: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
eaa0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
eab0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
eac0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
ead0: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
eae0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
eaf0: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
eb00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
eb10: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
eb20: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
eb30: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
eb40: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
eb50: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
eb60: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
eb70: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
eb80: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
eb90: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
eba0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
ebb0: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
ebc0: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
ebd0: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
ebe0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
ebf0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
ec00: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
ec10: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
ec20: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
ec30: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
ec40: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
ec50: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
ec60: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
ec70: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
ec80: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
ec90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
eca0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
ecb0: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
ecc0: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
ecd0: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
ece0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
ecf0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
ed00: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
ed10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
ed20: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
ed30: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
ed40: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
ed50: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
ed60: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
ed70: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
ed80: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
ed90: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
eda0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
edb0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
edc0: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
edd0: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
ede0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
edf0: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
ee00: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
ee10: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
ee20: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
ee30: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
ee40: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
ee50: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
ee60: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
ee70: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
ee80: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
ee90: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
eea0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
eeb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
eec0: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
eed0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
eee0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
eef0: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
ef00: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
ef10: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
ef20: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
ef30: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
ef40: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
ef50: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
ef60: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
ef70: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
ef80: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
ef90: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
efa0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
efb0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
efc0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
efd0: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
efe0: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
eff0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
f000: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
f010: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
f020: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
f030: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
f040: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
f050: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
f060: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
f070: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
f080: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
f090: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
f0a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
f0b0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
f0c0: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
f0d0: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50  Sync );.  if( pP
f0e0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
f0f0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
f100: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
f110: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
f120: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
f130: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
f140: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
f150: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
f160: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
f170: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
f180: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
f190: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
f1a0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
f1b0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f1c0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f1d0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
f1e0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
f1f0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
f200: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
f210: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
f220: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
f230: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
f240: 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  sh initializer *
f250: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
f260: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
f270: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f280: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
f290: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
f2a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f2b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f2c0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
f2d0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
f2e0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
f2f0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
f300: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
f310: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f320: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
f330: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
f340: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
f350: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
f360: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
f370: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
f380: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f390: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
f3a0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
f3b0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
f3c0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
f3d0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
f3e0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f3f0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
f400: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
f410: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
f420: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
f430: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
f440: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
f450: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
f460: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
f470: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
f480: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
f490: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
f4a0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
f4b0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
f4c0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
f4d0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
f4e0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
f4f0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
f500: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
f510: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
f520: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f530: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
f540: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
f550: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f560: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
f570: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
f580: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
f590: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
f5a0: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
f5b0: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
f5c0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
f5d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f5e0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
f5f0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
f600: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
f610: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
f620: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
f630: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
f640: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
f650: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
f660: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
f670: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
f680: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
f690: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
f6a0: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
f6b0: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
f6c0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
f6d0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
f6e0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
f6f0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
f700: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
f710: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
f720: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
f730: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
f740: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
f750: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
f760: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
f770: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
f780: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
f790: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
f7a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
f7b0: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
f7c0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
f7d0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
f7e0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
f7f0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
f800: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
f810: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
f820: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
f830: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
f840: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
f850: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
f860: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
f870: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
f880: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
f890: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
f8a0: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
f8b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f8c0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
f8d0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
f8e0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
f8f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
f900: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
f910: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
f920: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
f930: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
f940: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
f950: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
f960: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
f970: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
f980: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
f990: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
f9a0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
f9b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
f9c0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
f9d0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
f9e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
f9f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fa00: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
fa10: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa20: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
fa30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
fa40: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
fa50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fa60: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
fa70: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
fa80: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
fa90: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
faa0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
fab0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
fac0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
fad0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
fae0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
faf0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
fb00: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
fb10: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
fb20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
fb30: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
fb40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
fb50: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
fb60: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
fb70: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
fb80: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
fb90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fba0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
fbb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
fbc0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
fbd0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
fbe0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
fbf0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
fc00: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
fc10: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
fc20: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
fc30: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
fc40: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
fc50: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
fc60: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
fc70: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
fc80: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
fc90: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
fca0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
fcb0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
fcc0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
fcd0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
fce0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
fcf0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
fd00: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
fd10: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
fd20: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
fd30: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
fd40: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
fd50: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
fd60: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
fd70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
fd80: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
fd90: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
fda0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
fdb0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
fdc0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
fdd0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
fde0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
fdf0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
fe00: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
fe10: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
fe20: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
fe30: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
fe40: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
fe50: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
fe60: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
fe70: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe90: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
fea0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
feb0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
fec0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
fed0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
fee0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
fef0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
ff00: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
ff10: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
ff20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
ff30: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
ff40: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
ff50: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
ff60: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
ff70: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
ff80: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffa0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
ffb0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
ffc0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
ffd0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
ffe0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
fff0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
10000 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
10010 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
10020 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
10030 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
10040 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
10050 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
10060 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
10070 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
10080 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
10090 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
100a0 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
100b0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
100c0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
100d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
100e0 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
100f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
10100 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10110 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10120 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
10130 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
10140 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10150 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
10160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10170 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
10180 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
10190 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
101a0 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
101b0 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
101c0 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
101d0 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
101e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
101f0 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
10200 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
10210 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
10220 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10230 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
10240 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
10250 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
10260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
10270 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
10280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10290 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
102a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
102b0 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
102c0 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
102d0 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
102e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
102f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
10300 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
10310 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
10320 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
10330 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
10340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10350 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
10360 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
10370 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
10380 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
10390 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
103a0 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
103b0 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
103c0 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
103d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
103e0 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
103f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
10400 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
10410 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
10420 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
10430 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
10440 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10450 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
10460 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10470 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
10480 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
10490 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
104a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
104b0 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
104c0 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
104d0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
104e0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
104f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10500 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
10510 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10520 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
10530 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10540 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
10550 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
10560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
10570 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
10580 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
10590 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
105a0 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
105b0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
105c0 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
105d0 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  nal header */.. 
105e0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
105f0 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
10600 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
10610 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
10620 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
10630 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10640 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10650 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
10660 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
10670 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
10680 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
10690 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
106a0 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
106b0 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
106c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
106d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
106e0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
106f0 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
10700 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69   set the page-si
10710 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
10720 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68      ** journal h
10730 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49  eader to zero. I
10740 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73  n this case, ass
10750 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67  ume that the Pag
10760 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  er.pageSize.    
10770 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ** variable is a
10780 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68  lready set to th
10790 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73  e correct page s
107a0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
107b0 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30  if( iPageSize==0
107c0 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53   ){.      iPageS
107d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
107e0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  geSize;.    }.. 
107f0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
10800 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
10810 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
10820 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
10830 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
10840 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
10850 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
10860 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
10870 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
10880 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
10890 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
108a0 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
108b0 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
108c0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
108d0 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
108e0 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
108f0 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
10900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10910 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10930 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
10940 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
10950 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
10960 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
10970 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
10980 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
10990 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
109a0 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
109b0 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
109c0 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
109d0 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
109e0 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
109f0 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
10a00 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
10a10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
10a20 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
10a30 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
10a40 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
10a50 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
10a60 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
10a70 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
10a80 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
10a90 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
10aa0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
10ab0 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
10ac0 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
10ad0 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
10ae0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10b10 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
10b20 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
10b30 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
10b40 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
10b50 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
10b60 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
10b70 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
10b80 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
10b90 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
10ba0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
10bb0 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
10bc0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10bd0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
10be0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
10bf0 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20  geSize, -1);.   
10c00 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
10c10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
10c20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
10c30 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
10c40 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
10c50 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
10c60 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
10c70 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
10c80 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
10c90 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
10ca0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10cb0 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
10cc0 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
10cd0 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
10ce0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
10cf0 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
10d00 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
10d10 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
10d20 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
10d30 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
10d40 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
10d50 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10d60 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
10d70 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
10d80 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
10d90 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
10da0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10db0 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
10dc0 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
10dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
10de0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
10df0 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
10e00 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
10e10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10e20 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
10e30 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
10e40 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
10e50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e60 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
10e70 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
10e80 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
10e90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
10ea0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
10eb0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
10ec0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
10ed0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
10ee0 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
10ef0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
10f00 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
10f10 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
10f20 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
10f30 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
10f40 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
10f50 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
10f60 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10f70 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
10f80 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
10f90 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
10fa0 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
10fb0 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
10fc0 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
10fd0 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
10fe0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10ff0 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
11000 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
11010 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
11020 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
11030 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
11040 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
11050 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
11060 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
11070 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
11080 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
11090 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
110a0 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
110b0 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
110c0 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
110d0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
110e0 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
110f0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
11100 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
11110 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
11120 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11130 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
11140 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
11150 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
11160 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
11170 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
111a0 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
111d0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
111e0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
111f0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
11200 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
11210 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
11220 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
11230 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
11260 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
11270 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
11280 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11290 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
112a0 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
112b0 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
112c0 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
112d0 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
112e0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
112f0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
11300 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
11310 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
11320 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
11330 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11340 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e  Y .   || !isOpen
11350 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20  (pPager->jfd).  
11360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
11380 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
11390 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
113a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
113b0 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
113c0 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f  urnalOff );..  /
113d0 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20  * Calculate the 
113e0 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  length in bytes 
113f0 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
11400 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20   of zMaster */. 
11410 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20   for(nMaster=0; 
11420 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
11430 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20  ; nMaster++){.  
11440 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
11450 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d  er[nMaster];.  }
11460 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
11470 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
11480 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
11490 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
114a0 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
114b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
114c0 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
114d0 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
114e0 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
114f0 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
11500 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
11510 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
11520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
11530 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
11540 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
11550 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
11560 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
11570 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  );.  }.  iHdrOff
11580 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
11590 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69  alOff;..  /* Wri
115a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
115b0 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68  urnal data to th
115c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
115d0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20  rnal file. If.  
115e0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
115f0 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  rs, return the e
11600 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
11610 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20   caller..  */.  
11620 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20  if( (0 != (rc = 
11630 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11640 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11650 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
11660 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c  pPager)))).   ||
11670 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
11680 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11690 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
116a0 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f  , nMaster, iHdrO
116b0 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30  ff+4))).   || (0
116c0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
116d0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
116e0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
116f0 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29  ster, nMaster)))
11700 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11710 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11720 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11730 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c  Off+4+nMaster+4,
11740 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20   cksum))).   || 
11750 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
11760 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
11770 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
11780 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20 20 20  Magic, 8,.      
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 20 20 20 20 69 48 64 72 4f             iHdrO
117b0 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
117c0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
117d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
117e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
117f0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
11800 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
11810 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
11820 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
11830 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
11840 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
11850 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
11860 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11870 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11880 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
11890 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
118a0 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
118b0 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
118c0 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
118d0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
118e0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
118f0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11900 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
11910 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
11920 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
11930 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
11940 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
11950 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
11960 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
11970 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
11980 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
11990 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
119a0 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
119b0 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
119c0 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
119d0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
119e0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
119f0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11a00 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11a10 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
11a20 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11a30 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11a40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11a50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11a60 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11a70 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11a80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11a90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11aa0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
11ab0 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
11ac0 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
11ad0 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e  mory page-cache.
11ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11af0 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
11b00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
11b10 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11b20 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42  on++;.  sqlite3B
11b30 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
11b40 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
11b50 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
11b60 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
11b70 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
11b80 65 74 75 72 6e 20 74 68 65 20 70 50 61 67 65 72  eturn the pPager
11b90 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 20 76  ->iDataVersion v
11ba0 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  alue.*/.u32 sqli
11bb0 74 65 33 50 61 67 65 72 44 61 74 61 56 65 72 73  te3PagerDataVers
11bc0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
11bd0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r){.  assert( pP
11be0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
11bf0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74  ER_OPEN );.  ret
11c00 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74  urn pPager->iDat
11c10 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  aVersion;.}../*.
11c20 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
11c30 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
11c40 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
11c50 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
11c60 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
11c70 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
11c80 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
11c90 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
11ca0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
11cb0 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
11cc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
11cd0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
11ce0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
11cf0 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
11d00 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
11d10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
11d20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11d30 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
11d40 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11d50 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11d60 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
11d70 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11d80 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11d90 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
11da0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11db0 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
11dc0 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
11dd0 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
11de0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
11df0 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  | sqlite3Journal
11e00 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
11e10 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
11e20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11e30 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
11e40 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
11e50 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
11e60 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
11e70 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
11e80 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
11e90 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11ea0 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
11eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11ec0 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
11ed0 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
11ee0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
11ef0 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
11f00 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
11f10 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
11f20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
11f30 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
11f40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
11f50 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
11f60 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
11f70 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
11f80 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
11f90 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
11fa0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
11fd0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
11fe0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
11ff0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12000 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
12010 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12020 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12030 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
12040 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
12050 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
12060 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
12070 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
12080 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
12090 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
120a0 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
120b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
120c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
120d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
120e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
120f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
12100 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
12110 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52  ifdef SQLITE_SER
12130 56 45 52 5f 45 44 49 54 49 4f 4e 0a 2f 2a 0a 2a  VER_EDITION./*.*
12140 2a 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65  * Free the linke
12150 64 20 6c 69 73 74 20 6f 66 20 53 65 72 76 65 72  d list of Server
12160 50 61 67 65 20 6f 62 6a 65 63 74 73 20 68 65 61  Page objects hea
12170 64 65 64 20 61 74 20 50 61 67 65 72 2e 70 53 65  ded at Pager.pSe
12180 72 76 65 72 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  rverPage..*/.sta
12190 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72  tic void pagerFr
121a0 65 65 53 65 72 76 65 72 50 61 67 65 28 50 61 67  eeServerPage(Pag
121b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 53  er *pPager){.  S
121c0 65 72 76 65 72 50 61 67 65 20 2a 70 50 67 3b 0a  erverPage *pPg;.
121d0 20 20 53 65 72 76 65 72 50 61 67 65 20 2a 70 4e    ServerPage *pN
121e0 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  ext;.  for(pPg=p
121f0 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 50 61  Pager->pServerPa
12200 67 65 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ge; pPg; pPg=pNe
12210 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
12220 20 70 50 67 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pPg->pNext;.   
12230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
12240 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
12250 2d 3e 70 53 65 72 76 65 72 50 61 67 65 20 3d 20  ->pServerPage = 
12260 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
12270 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12280 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
12290 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
122a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
122b0 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  d not.** in the 
122c0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
122d0 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63  erwise, it switc
122e0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  hes the pager to
122f0 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73   PAGER_OPEN.** s
12300 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tate..**.** If t
12310 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
12320 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
12330 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61  ess mode, the da
12340 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a  tabase file is.*
12350 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c  * completely unl
12360 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69  ocked. If the fi
12370 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61  le is unlocked a
12380 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  nd the file-syst
12390 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65  em does.** not e
123a0 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c  xhibit the UNDEL
123b0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
123c0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a   property, the j
123d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
123e0 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20  * closed (if it 
123f0 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20  is open)..**.** 
12400 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12410 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
12420 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
12430 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
12440 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
12450 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12460 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62   are discarded b
12470 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20  efore switching 
12480 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20  back to .** the 
12490 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61  OPEN state. Rega
124a0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
124b0 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  r the pager is i
124c0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
124d0 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20  .** or not, any 
124e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66  journal file lef
124f0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
12500 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65  stem will be tre
12510 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74  ated.** as a hot
12520 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
12530 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78  led back the nex
12540 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72  t time a read-tr
12550 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12560 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20  opened (by this 
12570 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20  or by any other 
12580 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a  connection)..*/.
12590 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
125a0 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
125b0 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65  pPager){..  asse
125c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
125d0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
125e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
125f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12600 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c  R_OPEN .       |
12610 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12620 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20  ==PAGER_ERROR . 
12630 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69   );..  sqlite3Bi
12640 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
12650 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
12660 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
12670 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c  urnal = 0;.  rel
12680 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
12690 73 28 70 50 61 67 65 72 29 3b 0a 0a 23 69 66 64  s(pPager);..#ifd
126a0 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
126b0 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28 20 70  _EDITION.  if( p
126c0 61 67 65 72 49 73 53 65 72 76 65 72 28 70 50 61  agerIsServer(pPa
126d0 67 65 72 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ger) ){.    page
126e0 72 46 72 65 65 53 65 72 76 65 72 50 61 67 65 28  rFreeServerPage(
126f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
12700 69 74 65 33 53 65 72 76 65 72 45 6e 64 28 70 50  ite3ServerEnd(pP
12710 61 67 65 72 2d 3e 70 53 65 72 76 65 72 29 3b 0a  ager->pServer);.
12720 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12730 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
12740 0a 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66  .  }else .#endif
12750 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
12760 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
12770 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
12780 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
12790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
127a0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
127b0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
127c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
127d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
127e0 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  N;.  }else if( !
127f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
12800 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
12810 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
12830 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
12840 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b  d by pagerUnlock
12850 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Db() */.    int 
12860 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61  iDc = isOpen(pPa
12870 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33  ger->fd)?sqlite3
12880 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
12890 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
128a0 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  fd):0;..    /* I
128b0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
128c0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64  system support d
128d0 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20  eletion of open 
128e0 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20  files, then.    
128f0 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ** close the jou
12900 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
12910 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
12920 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65  base lock.  Othe
12930 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f  rwise.    ** ano
12940 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
12950 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
12960 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64  e=delete might d
12970 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20  elete the file. 
12980 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75     ** out from u
12990 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
129a0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
129b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
129c0 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20  EMORY   & 5)!=1 
129d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
129e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
129f0 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21  E_OFF      & 5)!
12a00 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12a10 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12a20 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20  MODE_WAL      & 
12a30 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12a40 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12a50 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
12a60 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12a70 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12a80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
12a90 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
12aa0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12ab0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
12ac0 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29  RSIST  & 5)==1 )
12ad0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44  ;.    if( 0==(iD
12ae0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
12af0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
12b00 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20  N_OPEN).     || 
12b10 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  1!=(pPager->jour
12b20 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20  nalMode & 5).   
12b30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12b40 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
12b50 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >jfd);.    }..  
12b60 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12b70 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f  r is in the ERRO
12b80 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12b90 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  call to unlock t
12ba0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
12bb0 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73  ** file fails, s
12bc0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  et the current l
12bd0 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  ock to UNKNOWN_L
12be0 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  OCK. See the com
12bf0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76  ment.    ** abov
12c00 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
12c10 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  r UNKNOWN_LOCK f
12c20 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
12c30 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  n of why this.  
12c40 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72    ** is necessar
12c50 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  y..    */.    rc
12c60 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
12c70 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b  (pPager, NO_LOCK
12c80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
12c90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
12ca0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12cb0 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20  R_ERROR ){.     
12cc0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
12cd0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20   UNKNOWN_LOCK;. 
12ce0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
12cf0 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79   pager state may
12d00 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   be changed from
12d10 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20   PAGER_ERROR to 
12d20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a  PAGER_OPEN here.
12d30 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63      ** without c
12d40 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f  learing the erro
12d50 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  r code. This is 
12d60 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68  intentional - th
12d70 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63  e error.    ** c
12d80 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61  ode is cleared a
12d90 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73  nd the cache res
12da0 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  et in the block 
12db0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
12dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12dd0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61  ->errCode || pPa
12de0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
12df0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20  ER_ERROR );.    
12e00 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12e10 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
12e20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12e30 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
12e40 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72  }..  /* If Pager
12e50 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
12e60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12e70 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12e80 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20   cannot be.  ** 
12e90 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
12ea0 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  t there are no o
12eb0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
12ec0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
12ed0 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20  er,.  ** it can 
12ee0 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b  safely move back
12ef0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   to PAGER_OPEN s
12f00 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65  tate. This happe
12f10 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20  ns in both.  ** 
12f20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75  normal and exclu
12f30 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
12f40 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
12f50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12f60 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
12f70 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
12f80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12f90 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
12fa0 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
12fb0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
12fc0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
12fd0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12fe0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
12ff0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
13000 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
13010 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  N;.    }else{.  
13020 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
13030 74 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61  te = (isOpen(pPa
13040 67 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45  ger->jfd) ? PAGE
13050 52 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52  R_OPEN : PAGER_R
13060 45 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20  EADER);.    }.  
13070 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70    if( USEFETCH(p
13080 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33  Pager) ) sqlite3
13090 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
130a0 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
130b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
130c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
130d0 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
130e0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
130f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13100 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
13110 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
13120 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
13130 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
13140 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13150 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
13160 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
13170 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
13180 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
13190 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
131a0 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
131b0 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
131c0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
131d0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
131e0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
131f0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
13200 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
13210 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
13220 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
13230 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
13240 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
13250 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
13260 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
13270 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
13280 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
13290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
132a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
132b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
132c0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
132d0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
132e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
132f0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
13300 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
13310 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
13320 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13330 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
13340 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
13350 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
13360 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
13370 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
13380 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
13390 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
133a0 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
133b0 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
133c0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
133d0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
133e0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
133f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13400 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
13410 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
13420 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
13430 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
13440 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
13450 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
13460 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
13470 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
13480 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13490 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
134a0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
134b0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
134c0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
134d0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
134e0 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
134f0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
13500 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13510 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13520 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
13530 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
13540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13550 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
13560 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
13570 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
13580 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
13590 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
135a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
135b0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
135c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
135d0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
135e0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
135f0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
13600 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
13610 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
13620 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
13630 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
13640 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
13650 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
13660 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
13670 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
13680 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
13690 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
136a0 4f 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65  OR;.    setGette
136b0 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b  rMethod(pPager);
136c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
136d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
136e0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
136f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
13700 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
13710 2a 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e  * The write tran
13720 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
13730 70 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20  pPager is being 
13740 63 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d  committed (bComm
13750 69 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c  it==1).** or rol
13760 6c 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69  led back (bCommi
13770 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  t==0)..**.** Ret
13780 75 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20  urn TRUE if and 
13790 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74  only if all dirt
137a0 79 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62  y pages should b
137b0 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
137c0 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a  k..**.** Rules:.
137d0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e  **.**   *  For n
137e0 6f 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65  on-TEMP database
137f0 73 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74  s, always sync t
13800 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73  o disk.  This is
13810 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20   necessary.**   
13820 20 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69     for transacti
13830 6f 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c  ons to be durabl
13840 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79  e..**.**   *  Sy
13850 6e 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  nc TEMP database
13860 20 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49   only on a COMMI
13870 54 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43  T (not a ROLLBAC
13880 4b 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b  K) when the back
13890 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  ing.**      file
138a0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
138b0 64 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61  d already (via a
138c0 20 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53   spill on pagerS
138d0 74 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20  tress()) and.** 
138e0 20 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75       when the nu
138f0 6d 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61  mber of dirty pa
13900 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78  ges in memory ex
13910 63 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65  ceeds 25% of the
13920 20 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63   total.**      c
13930 61 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ache size..*/.st
13940 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c  atic int pagerFl
13950 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65  ushOnCommit(Page
13960 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62  r *pPager, int b
13970 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70  Commit){.  if( p
13980 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
13990 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
139a0 20 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20   if( !bCommit ) 
139b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
139c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
139d0 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
139e0 20 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65    return (sqlite
139f0 33 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69  3PCachePercentDi
13a00 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
13a10 63 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a  che)>=25);.}../*
13a20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13a30 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
13a40 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
13a50 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
13a60 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
13a70 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
13a80 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
13a90 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
13aa0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
13ab0 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
13ac0 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
13ad0 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
13ae0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
13af0 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
13b00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
13b10 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
13b20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
13b30 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
13b40 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
13b50 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  n..** .** This r
13b60 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
13b70 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f  called in PAGER_
13b80 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20  ERROR state. If 
13b90 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  it is called.** 
13ba0 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72  in PAGER_NONE or
13bb0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
13bc0 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ate and the lock
13bd0 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a   held is less.**
13be0 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20   exclusive than 
13bf0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  a RESERVED lock,
13c00 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
13c10 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
13c20 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
13c30 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
13c40 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
13c50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13c60 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
13c70 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
13c80 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
13c90 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
13ca0 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
13cb0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13cc0 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
13cd0 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
13ce0 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
13cf0 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
13d00 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
13d10 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
13d20 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
13d30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13d40 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
13d50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13d60 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
13d70 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
13d80 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
13d90 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13da0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
13db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
13dc0 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
13dd0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
13de0 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
13df0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13e00 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
13e10 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
13e20 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
13e30 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
13e40 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
13e50 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
13e60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
13e70 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
13e80 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
13e90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
13ea0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
13eb0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
13ec0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13ed0 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
13ee0 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
13ef0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
13f00 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
13f10 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
13f20 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
13f30 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
13f40 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
13f50 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
13f60 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
13f70 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
13f80 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
13f90 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
13fa0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
13fb0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13fc0 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
13fd0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13fe0 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
13ff0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
14000 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
14010 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
14020 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
14030 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
14040 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
14050 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
14060 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
14070 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
14080 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
14090 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
140a0 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
140b0 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
140c0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
140d0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
140e0 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
140f0 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
14100 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
14110 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
14120 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
14130 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
14140 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  ized, the pager 
14150 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52  moves to PAGER_R
14160 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20  EADER state..** 
14170 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  If running in no
14180 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c  n-exclusive roll
14190 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c  back mode, the l
141a0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
141b0 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65  is .** downgrade
141c0 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f  d to a SHARED_LO
141d0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  CK..**.** SQLITE
141e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
141f0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
14200 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
14210 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
14220 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
14230 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
14240 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
14250 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
14260 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
14270 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
14280 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14290 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
142a0 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
142b0 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
142c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
142d0 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
142e0 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
142f0 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
14300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14310 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
14320 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
14330 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
14340 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
14350 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
14360 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
14370 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
14380 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
14390 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
143a0 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
143b0 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
143c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
143d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
143e0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
143f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14400 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20   hasMaster, int 
14410 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20  bCommit){.  int 
14420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14430 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14440 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
14450 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
14460 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14470 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
14480 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
14490 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
144a0 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
144b0 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
144c0 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65  hing if the page
144d0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
144e0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
144f0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f  ansaction.  ** o
14500 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  r at least a RES
14510 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73  ERVED lock. This
14520 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
14530 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
14540 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72  re.  ** is no wr
14550 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14560 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53  active but a RES
14570 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
14580 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65   lock is.  ** he
14590 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72  ld under two cir
145a0 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a  cumstances:.  **
145b0 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72  .  **   1. After
145c0 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f   a successful ho
145d0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
145e0 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ck, it is called
145f0 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20   with.  **      
14600 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f  eState==PAGER_NO
14610 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58  NE and eLock==EX
14620 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20  CLUSIVE_LOCK..  
14630 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20  **.  **   2. If 
14640 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  a connection wit
14650 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
14660 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67  xclusive holding
14670 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20   an EXCLUSIVE . 
14680 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77   **      lock sw
14690 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c  itches back to l
146a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
146b0 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63  al and then exec
146c0 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20  utes a.  **     
146d0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
146e0 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  n, this function
146f0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
14700 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
14710 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20  ADER .  **      
14720 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14730 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  SIVE_LOCK when t
14740 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74  he read-transact
14750 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20  ion is closed.. 
14760 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73   */.  assert( as
14770 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14780 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
14790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
147a0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
147b0 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  R );.  if( pPage
147c0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
147d0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26  WRITER_LOCKED &&
147e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52   pPager->eLock<R
147f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
14800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14810 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c  E_OK;.  }..  rel
14820 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
14830 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  s(pPager);.  ass
14840 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
14850 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
14860 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
14870 30 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c  0 .      || (sql
14880 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
14890 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
148a0 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
148b0 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
148c0 43 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73  C).  );.  if( is
148d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
148e0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
148f0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
14900 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
14910 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   Finalize the jo
14920 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
14930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f     if( sqlite3Jo
14940 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
14950 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
14960 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
14970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14980 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14990 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
149a0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
149b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
149c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
149d0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
149e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
149f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
14a00 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
14a10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14a20 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
14a30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14a40 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
14a50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14a60 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
14a70 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
14a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
14aa0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
14ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
14ac0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77  ake sure the new
14ad0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72   file size is wr
14ae0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
14af0 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e  node right away.
14b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  .          ** Ot
14b10 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72  herwise the jour
14b20 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72  nal might resurr
14b30 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ect following a 
14b40 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20  power loss and. 
14b50 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73           ** caus
14b60 65 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73  e the last trans
14b70 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62  action to roll b
14b80 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20  ack.  See.      
14b90 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62      ** https://b
14ba0 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e  ugzilla.mozilla.
14bb0 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69  org/show_bug.cgi
14bc0 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20  ?id=1072773.    
14bd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14bf0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
14c00 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
14c10 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  lags);.        }
14c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c40 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
14c50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14c60 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14c70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
14c80 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
14c90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14ca0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
14cb0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
14cc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
14cd0 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
14ce0 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
14cf0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
14d00 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74  aster||pPager->t
14d10 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
14d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14d30 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ff = 0;.    }els
14d40 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  e{.      /* This
14d50 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65   branch may be e
14d60 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67  xecuted with Pag
14d70 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  er.journalMode==
14d80 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20  MEMORY if.      
14d90 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
14da0 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64   was just rolled
14db0 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63   back. In this c
14dc0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ase the journal.
14dd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68        ** file sh
14de0 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61  ould be closed a
14df0 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  nd deleted. If t
14e00 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
14e10 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a  rites to.      *
14e20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
14e30 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20  ile, it will do 
14e40 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d  so using an in-m
14e50 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20  emory journal.. 
14e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
14e70 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61  t bDelete = !pPa
14e80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
14e90 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
14ea0 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
14eb0 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
14ec0 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  d)==0 );.      a
14ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
14ee0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14ef0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
14f00 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20  LETE .          
14f10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
14f20 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14f30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
14f40 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y .           ||
14f50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14f60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14f70 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
14f80 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
14f90 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14fa0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
14fb0 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
14fc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14fd0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
14fe0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
14ff0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
15000 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20  r->extraSync);. 
15010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15020 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15030 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
15040 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
15050 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
15060 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
15070 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
15080 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
15090 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
150a0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
150b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
150c0 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
150d0 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
150e0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  Lookup(pPager, 1
150f0 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
15100 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
15110 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
15120 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
15130 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
15140 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
15150 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15160 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
15170 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
15180 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
15190 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
151a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
151b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
151c0 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61   if( MEMDB || pa
151d0 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
151e0 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74  (pPager, bCommit
151f0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
15200 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
15210 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15220 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15230 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
15240 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
15250 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
15260 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15270 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
15280 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15290 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
152a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
152b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
152c0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
152d0 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
152e0 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
152f0 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
15300 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
15310 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
15320 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
15330 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
15340 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
15350 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
15360 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
15370 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
15380 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
15390 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
153a0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
153b0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
153c0 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
153d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
153e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
153f0 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
15400 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
15410 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
15420 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
15430 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
15440 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
15450 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
15460 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
15470 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
15480 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
15490 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
154a0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
154b0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
154c0 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
154d0 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
154e0 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
154f0 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
15500 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
15510 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
15520 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
15530 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
15540 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
15550 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
15560 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
15570 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
15580 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
15590 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
155a0 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
155b0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
155c0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
155d0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
155e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
155f0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
15600 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
15610 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
15620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15630 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
15640 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
15650 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15660 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15670 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
15680 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
15690 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
156a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
156b0 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
156c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
156d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
156e0 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69  RVER_EDITION.  i
156f0 66 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72  f( pagerIsServer
15700 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
15710 72 63 32 20 3d 20 73 71 6c 69 74 65 33 53 65 72  rc2 = sqlite3Ser
15720 76 65 72 52 65 6c 65 61 73 65 57 72 69 74 65 4c  verReleaseWriteL
15730 6f 63 6b 73 28 70 50 61 67 65 72 2d 3e 70 53 65  ocks(pPager->pSe
15740 72 76 65 72 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  rver);.  }else.#
15750 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 61  endif.  if( !pPa
15760 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
15770 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65  de .   && (!page
15780 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
15790 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  || sqlite3WalExc
157a0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
157b0 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29  r->pWal, 0)).  )
157c0 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  {.    rc2 = page
157d0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
157e0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
157f0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
15800 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
15810 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65  .  }.  pPager->e
15820 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
15830 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ADER;.  pPager->
15840 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  setMaster = 0;..
15850 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
15860 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
15870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
15880 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
15890 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
158a0 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
158b0 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
158c0 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
158d0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
158e0 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
158f0 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
15900 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
15910 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
15920 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
15930 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
15940 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
15950 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
15960 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
15970 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
15980 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
15990 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
159a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
159b0 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67  and move the pag
159c0 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  er back to OPEN 
159d0 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a  state. If this .
159e0 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
159f0 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
15a00 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
15a10 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
15a20 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65  e next .** conne
15a30 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
15a40 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
15a50 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
15a60 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
15a70 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c  e) .** will roll
15a80 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
15a90 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
15aa0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
15ab0 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15ac0 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
15ad0 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
15ae0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
15af0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
15b00 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
15b10 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
15b20 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
15b30 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
15b40 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
15b50 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
15b60 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
15b70 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
15b80 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
15b90 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
15ba0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
15bb0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
15bc0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15bd0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
15be0 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e  RROR && pPager->
15bf0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
15c00 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EN ){.    assert
15c10 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
15c20 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
15c30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15c40 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
15c50 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
15c60 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
15c70 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
15c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
15c90 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
15ca0 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
15cb0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
15cc0 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c();.    }else i
15cd0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
15ce0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
15cf0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15d00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
15d10 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20  _READER );.     
15d20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
15d30 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
15d40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
15d50 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
15d60 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
15d70 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
15d80 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
15d90 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
15da0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
15db0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
15dc0 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
15dd0 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
15de0 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
15df0 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
15e00 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
15e10 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
15e20 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
15e30 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
15e40 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
15e50 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
15e60 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
15e70 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
15e80 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
15e90 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
15ea0 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
15eb0 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
15ec0 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
15ed0 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
15ee0 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
15ef0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
15f00 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
15f10 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
15f20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
15f30 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
15f40 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
15f50 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
15f60 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
15f70 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
15f80 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
15f90 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
15fa0 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
15fb0 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
15fc0 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
15fd0 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
15fe0 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
15ff0 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
16000 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
16010 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
16020 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
16030 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
16040 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
16050 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
16060 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
16070 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
16080 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
16090 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
160a0 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
160b0 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
160c0 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
160d0 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
160e0 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
160f0 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
16100 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
16110 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
16120 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
16130 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16140 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
16150 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
16160 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
16170 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
16180 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
16190 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
161a0 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
161b0 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
161c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
161d0 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
161e0 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
161f0 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
16200 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
16210 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
16220 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
16230 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
16240 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
16250 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16260 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
16270 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
16280 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16290 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
162a0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
162b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
162c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
162d0 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
162e0 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
162f0 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
16300 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
16310 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
16340 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
16350 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
16360 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
16370 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
16380 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
16390 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
163a0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
163b0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
163c0 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  DEC./*.** Make s
163d0 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
163e0 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
163f0 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74  is the same in t
16400 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a  he destination.*
16410 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69 73  * pager as it is
16420 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 20   in the source. 
16430 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20 77   This comes up w
16440 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68 61  hen a VACUUM cha
16450 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  nges the.** numb
16460 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16470 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74 69  its to the "opti
16480 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a  mal" amount..*/.
16490 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
164a0 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50 61  rAlignReserve(Pa
164b0 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67 65  ger *pDest, Page
164c0 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28 20  r *pSrc){.  if( 
164d0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 21  pDest->nReserve!
164e0 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 20  =pSrc->nReserve 
164f0 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 52  ){.    pDest->nR
16500 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e  eserve = pSrc->n
16510 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
16520 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44 65  erReportSize(pDe
16530 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  st);.  }.}.#endi
16540 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
16550 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
16560 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
16570 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
16580 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
16590 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
165a0 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
165b0 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
165c0 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
165d0 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
165e0 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
165f0 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
16600 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
16610 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
16620 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
16630 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
16640 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
16650 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
16660 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
16670 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
16680 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
16690 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
166a0 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
166b0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
166c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
166d0 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
166e0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
166f0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
16700 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
16710 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
16720 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
16730 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
16740 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
16750 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16760 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
16770 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
16780 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
16790 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
167a0 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
167b0 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
167c0 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
167d0 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
167e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
167f0 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
16800 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
16810 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
16820 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
16830 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
16840 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16850 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
16860 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
16870 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
16880 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
16890 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
168a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
168b0 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
168c0 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
168d0 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
168e0 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
168f0 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
16900 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16910 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
16920 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
16930 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
16940 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
16950 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
16960 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
16970 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
16980 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
16990 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
169a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
169b0 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
169c0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
169d0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
169e0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
169f0 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
16a00 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
16a10 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
16a20 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
16a30 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
16a40 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
16a50 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
16a60 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
16a70 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
16a80 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
16a90 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
16aa0 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
16ab0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
16ac0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
16ad0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
16ae0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
16af0 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
16b00 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
16b10 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
16b20 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
16b30 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
16b40 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
16b50 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
16b60 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
16b70 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
16b80 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
16b90 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16ba0 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
16bb0 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
16bc0 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
16bd0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
16be0 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
16bf0 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
16c00 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
16c10 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
16c20 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
16c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16c40 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
16c50 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
16c60 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16c70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16c80 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
16c90 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
16ca0 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
16cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
16cc0 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
16cd0 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
16ce0 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d00 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
16d10 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
16d20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
16d30 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
16d40 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
16d50 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
16d60 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
16d70 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
16d80 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
16d90 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
16da0 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16db0 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
16dc0 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
16dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16de0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
16df0 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
16e00 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
16e10 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
16e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
16e30 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
16e40 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
16e50 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
16e80 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
16e90 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
16ea0 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
16eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16ec0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
16ed0 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
16ee0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16ef0 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
16f00 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
16f10 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
16f20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
16f30 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16f50 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
16f60 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
16f70 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
16f80 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f 2a  E_HAS_CODEC.  /*
16f90 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c 61   The jrnlEnc fla
16fa0 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f 75  g is true if Jou
16fb0 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75 6c  rnal pages shoul
16fc0 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72 6f  d be passed thro
16fd0 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64  ugh.  ** the cod
16fe0 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73 65  ec.  It is false
16ff0 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65 6d   for pure in-mem
17000 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ory journals. */
17010 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72 6e  .  const int jrn
17020 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a 72  lEnc = (isMainJr
17030 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  nl || pPager->su
17040 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b 0a  bjInMemory==0);.
17050 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
17060 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31  ( (isMainJrnl&~1
17070 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  )==0 );      /* 
17080 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20  isMainJrnl is 0 
17090 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
170a0 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29  ( (isSavepnt&~1)
170b0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  ==0 );       /* 
170c0 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f  isSavepnt is 0 o
170d0 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  r 1 */.  assert(
170e0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70   isMainJrnl || p
170f0 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70  Done );     /* p
17100 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64  Done always used
17110 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73   on sub-journals
17120 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
17130 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65  Savepnt || pDone
17140 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e  ==0 );   /* pDon
17150 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20  e never used on 
17160 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f  non-savepoint */
17170 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61 67  ..  aData = pPag
17180 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
17190 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
171a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
171b0 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
171c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
171d0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
171e0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
171f0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
17200 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  | (!isMainJrnl &
17210 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a  & isSavepnt) );.
17220 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65  .  /* Either the
17230 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74 65   state is greate
17240 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49  r than PAGER_WRI
17250 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20  TER_CACHEMOD (a 
17260 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
17270 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  * or savepoint r
17280 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20  ollback done at 
17290 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20 74  the request of t
172a0 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68  he caller) or th
172b0 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74  is is.  ** a hot
172c0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
172d0 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68 6f  k. If it is a ho
172e0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
172f0 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20  ck, the pager.  
17300 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f  ** is in state O
17310 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e  PEN and holds an
17320 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
17330 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   Hot-journal rol
17340 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20  lback.  ** only 
17350 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  reads from the m
17360 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74  ain journal, not
17370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17380 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
17390 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
173a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
173b0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
173c0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
173d0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
173e0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
173f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
17400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17410 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
17420 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
17430 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e  MOD || isMainJrn
17440 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  l );..  /* Read 
17450 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
17460 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
17470 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
17480 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
17490 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
174a0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
174b0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
174c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
174d0 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
174e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
174f0 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
17500 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
17510 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
17520 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
17530 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17540 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17550 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
17560 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
17570 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17580 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
17590 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
175a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
175b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
175c0 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
175d0 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
175e0 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
175f0 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
17600 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
17610 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
17620 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
17630 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
17640 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
17650 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
17660 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
17670 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
17680 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
17690 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
176a0 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
176b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
176c0 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
176d0 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
176e0 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
176f0 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
17700 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
17710 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
17720 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
17730 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
17740 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
17750 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
17760 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
17770 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
17780 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
17790 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
177a0 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
177b0 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
177c0 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
177d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
177e0 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
177f0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
17800 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17810 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
17820 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
17830 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
17840 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
17850 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
17860 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
17870 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
17880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17890 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
178a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
178b0 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  s page has alrea
178c0 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
178d0 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e  ack before durin
178e0 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
178f0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
17900 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
17910 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
17920 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
17930 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
17940 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
17950 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
17960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
17980 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
17990 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
179a0 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
179b0 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
179c0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
179d0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
179e0 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
179f0 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
17a00 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
17a10 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
17a20 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
17a30 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
17a40 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
17a50 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
17a60 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
17a70 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
17a80 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
17a90 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
17aa0 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
17ab0 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
17ac0 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
17ad0 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
17ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17af0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
17b00 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
17b10 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
17b20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
17b30 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
17b40 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
17b50 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
17b60 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
17b70 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
17b80 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
17b90 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
17ba0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
17bb0 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
17bc0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
17bd0 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
17be0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
17bf0 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
17c00 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
17c10 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
17c20 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
17c30 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
17c40 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
17c50 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
17c60 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
17c70 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
17c80 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
17c90 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
17ca0 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
17cb0 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
17cc0 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
17cd0 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
17ce0 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
17cf0 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
17d00 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
17d10 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
17d20 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
17d30 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
17d40 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
17d50 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
17d60 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
17d70 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
17d80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
17d90 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
17da0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17db0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
17dc0 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
17dd0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
17de0 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
17df0 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
17e00 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
17e10 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
17e20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
17e30 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
17e40 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
17e50 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
17e60 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17e70 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17e80 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
17e90 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
17ea0 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
17eb0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
17ec0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
17ed0 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
17ee0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
17ef0 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
17f00 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
17f10 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
17f20 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
17f30 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
17f40 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
17f50 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
17f60 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
17f70 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
17f80 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
17f90 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
17fa0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
17fb0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
17fc0 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
17fd0 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
17fe0 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
17ff0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
18000 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
18010 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
18020 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18030 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
18040 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
18050 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
18060 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
18070 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
18080 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
18090 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
180a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
180b0 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
180c0 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
180d0 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
180e0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
180f0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
18100 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
18110 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
18120 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
18130 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
18140 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
18150 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
18160 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
18170 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
18180 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
18190 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
181a0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
181b0 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
181c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
181d0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
181e0 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
181f0 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
18200 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
18210 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
18220 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
18230 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
18240 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
18250 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
18260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
18270 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
18280 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
18290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
182a0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
182b0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
182c0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
182d0 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
182e0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
182f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
18300 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
18310 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
18320 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41 47  empFile );.  PAG
18330 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
18340 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
18350 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
18360 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
18370 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
18380 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
18390 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
183a0 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
183b0 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
183c0 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
183d0 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
183e0 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
183f0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
18400 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
18410 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
18420 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
18430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
18440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
18450 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
18460 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
18470 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
18480 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
18490 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
184a0 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
184b0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
184c0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
184d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
184e0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
184f0 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
18500 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
18510 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
18520 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18530 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
18540 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
18550 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
18560 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
18570 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
18580 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
18590 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
185a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
185b0 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d 20   data read from 
185c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
185d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
185e0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20  se file..    ** 
185f0 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
18600 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61 6e  safe even for an
18610 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
18620 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61 74  ase - as the dat
18630 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 63  a.    ** was enc
18640 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69 74  rypted before it
18650 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
18660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18670 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
18680 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 65      ** is if the
18690 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20 72   data was just r
186a0 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ead from an in-m
186b0 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61  emory sub-journa
186c0 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20 2a  l. In that.    *
186d0 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20 62  * case it must b
186e0 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72 65  e encrypted here
186f0 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63 6f   before it is co
18700 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64 61  pied into the da
18710 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18720 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  le.  */.#ifdef S
18730 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18740 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e 63      if( !jrnlEnc
18750 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 32   ){.      CODEC2
18760 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
18770 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
18780 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61  TE_NOMEM_BKPT, a
18790 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63 20  Data);.      rc 
187a0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
187b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
187c0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
187d0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
187e0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
187f0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
18800 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18810 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18820 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
18830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18840 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
18850 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
18860 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18870 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20 69  e, ofst);..    i
18880 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
18890 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
188a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
188b0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
188c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
188d0 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
188e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
188f0 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69 66  S_CODEC.      if
18900 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20  ( jrnlEnc ){.   
18910 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
18920 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
18930 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
18940 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 20  MEM_BKPT);.     
18950 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
18960 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
18970 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
18980 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
18990 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
189a0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
189b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
189c0 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a 20  M_BKPT,aData);. 
189d0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
189e0 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  f.      sqlite3B
189f0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
18a00 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
18a10 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
18a20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18a30 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
18a40 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
18a50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
18a60 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
18a70 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
18a80 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
18a90 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
18aa0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
18ab0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
18ac0 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
18ad0 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
18ae0 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
18af0 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
18b00 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
18b10 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
18b20 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
18b30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
18b40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
18b50 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
18b60 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
18b70 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
18b80 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
18b90 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
18ba0 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
18bb0 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
18bc0 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
18bd0 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
18be0 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
18bf0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
18c00 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
18c10 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
18c20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
18c30 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
18c40 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
18c50 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
18c60 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
18c70 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
18c80 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
18c90 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
18ca0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
18cb0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
18cc0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
18cd0 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
18ce0 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
18cf0 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
18d00 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
18d10 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
18d20 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
18d30 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
18d40 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
18d50 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
18d60 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
18d70 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
18d80 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
18d90 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
18da0 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
18db0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
18dc0 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
18dd0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
18de0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
18df0 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
18e00 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ACK)==0 );.    p
18e10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18e20 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52  l |= SPILLFLAG_R
18e30 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20  OLLBACK;.    rc 
18e40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
18e50 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
18e60 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73  &pPg, 1);.    as
18e70 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
18e80 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
18e90 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21  LFLAG_ROLLBACK)!
18ea0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
18eb0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
18ec0 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  ~SPILLFLAG_ROLLB
18ed0 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ACK;.    if( rc!
18ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18ef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69  urn rc;.    sqli
18f00 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
18f10 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  ty(pPg);.  }.  i
18f20 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
18f30 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
18f40 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
18f50 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
18f60 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
18f70 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
18f80 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
18f90 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
18fa0 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
18fb0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
18fc0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
18fd0 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
18fe0 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
18ff0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
19000 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
19010 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
19020 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
19030 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
19040 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
19050 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
19060 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
19070 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
19080 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70    pData = pPg->p
19090 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Data;.    memcpy
190a0 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61  (pData, (u8*)aDa
190b0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
190c0 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
190d0 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
190e0 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73 65  );.    /* It use
190f0 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71 6c  d to be that sql
19100 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
19110 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61 6c  ean(pPg) was cal
19120 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a 20  led here.  But. 
19130 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c 20     ** that call 
19140 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61 6e  was dangerous an
19150 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74 61  d had no detecta
19160 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e 63  ble benefit sinc
19170 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20 20  e the cache.    
19180 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 63  ** is normally c
19190 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74 65  leaned by sqlite
191a0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
191b0 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  ) after rollback
191c0 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20 68   and so.    ** h
191d0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  as been removed.
191e0 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73 65   */.    pager_se
191f0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
19200 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
19210 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
19220 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
19230 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
19240 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
19250 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
19260 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
19270 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
19280 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
19290 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
192a0 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
192b0 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
192c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
192d0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
192e0 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
192f0 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
19300 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51 4c   disk */.#if SQL
19310 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19320 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b    if( jrnlEnc ){
19330 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
19340 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
19350 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
19360 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23 65  OMEM_BKPT); }.#e
19370 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
19380 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
19390 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
193a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
193b0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
193c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
193d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
193e0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
193f0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
19400 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
19410 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19420 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
19430 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
19440 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
19450 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
19460 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
19470 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
19480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
19490 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
194a0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
194b0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
194c0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
194d0 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
194e0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
194f0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
19500 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
19510 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19520 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
19530 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19540 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
19550 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
19560 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
19570 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
19580 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
19590 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
195a0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
195b0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
195c0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
195d0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
195e0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
195f0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
19600 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
19610 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
19620 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19630 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
19640 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
19650 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
19660 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
19670 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
19680 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
19690 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
196a0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
196b0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
196c0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
196d0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
196e0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
196f0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
19700 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
19710 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
19720 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19730 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19740 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
19750 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
19760 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
19770 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
19780 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
19790 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
197a0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
197b0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
197c0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
197d0 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
197e0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
197f0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
19800 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
19810 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
19820 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
19830 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
19840 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
19850 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
19860 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
19870 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
19880 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
19890 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
198a0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
198b0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
198c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
198d0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
198e0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
198f0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
19900 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
19910 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
19920 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
19930 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
19940 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
19950 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
19960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
19970 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
19980 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
19990 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
199a0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
199b0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
199c0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
199d0 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
199e0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
199f0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
19a00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
19a10 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
19a20 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
19a30 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
19a40 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
19a50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19a60 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
19a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
19a80 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
19a90 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
19aa0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
19ab0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
19ac0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19ad0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
19ae0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
19af0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
19b00 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
19b10 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
19b20 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
19b30 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
19b40 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
19b50 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
19b60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
19b70 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
19b80 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
19b90 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
19ba0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
19bb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
19bc0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
19bd0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
19be0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
19bf0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
19c00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
19c20 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
19c30 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
19c40 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19c50 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
19c60 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
19c70 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
19c80 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
19c90 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19ca0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
19cb0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
19cc0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
19cd0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
19ce0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
19cf0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
19d00 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
19d10 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
19d20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
19d30 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
19d40 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
19d50 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
19d60 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
19d70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
19d80 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
19d90 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
19da0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
19db0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
19dc0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19dd0 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
19de0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
19df0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
19e00 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
19e10 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
19e20 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
19e30 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
19e40 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
19e50 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
19e60 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
19e70 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
19e80 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
19e90 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
19ea0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
19eb0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
19ec0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
19ed0 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
19ee0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19ef0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19f00 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
19f10 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
19f20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
19f30 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19f40 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
19f50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19f60 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
19f70 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
19f80 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
19f90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19fa0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19fb0 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
19fc0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
19fd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19fe0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
19ff0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
1a000 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
1a010 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
1a020 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
1a030 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
1a040 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
1a050 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
1a060 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
1a070 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
1a080 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
1a090 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
1a0a0 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
1a0b0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
1a0c0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1a0d0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
1a0e0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
1a0f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
1a100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1a110 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
1a120 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
1a130 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
1a140 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
1a150 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1a160 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
1a170 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
1a180 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
1a190 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
1a1a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a1b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
1a1c0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a1d0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
1a1e0 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
1a1f0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
1a200 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
1a210 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1a220 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
1a230 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
1a240 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
1a250 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1a260 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
1a270 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
1a280 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
1a290 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
1a2a0 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
1a2b0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
1a2c0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
1a2d0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
1a2e0 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
1a2f0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
1a300 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
1a310 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1a320 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
1a330 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1a340 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
1a350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
1a370 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a390 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
1a3a0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
1a3b0 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
1a3c0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
1a3d0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
1a3e0 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
1a3f0 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
1a400 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
1a410 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
1a420 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
1a430 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
1a440 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
1a450 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
1a460 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a470 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
1a480 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
1a490 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
1a4a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1a4b0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
1a4c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1a4d0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
1a4e0 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
1a4f0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
1a500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a510 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1a520 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a530 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
1a540 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1a550 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
1a560 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
1a570 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
1a580 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
1a590 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
1a5a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a5b0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
1a5c0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a5d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
1a5e0 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
1a5f0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
1a600 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
1a610 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
1a620 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
1a630 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
1a640 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
1a650 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a660 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
1a670 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
1a680 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1a690 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
1a6a0 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
1a6b0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
1a6c0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
1a6d0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
1a6e0 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
1a6f0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
1a700 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
1a710 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
1a720 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
1a730 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
1a740 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
1a750 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1a760 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
1a770 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
1a780 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
1a790 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
1a7a0 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
1a7b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1a7c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a7d0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
1a7e0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
1a7f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1a800 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
1a810 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
1a820 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1a830 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
1a840 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
1a850 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
1a860 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1a870 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
1a880 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
1a890 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
1a8a0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
1a8b0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1a8c0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
1a8d0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
1a8e0 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
1a8f0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
1a900 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1a910 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1a920 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
1a930 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
1a940 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
1a950 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
1a960 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1a970 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
1a980 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
1a990 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
1a9a0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
1a9b0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
1a9c0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
1a9d0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
1a9e0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
1a9f0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  Or, it might be 
1aa00 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
1aa10 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
1aa20 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
1aa30 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
1aa40 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
1aa50 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
1aa60 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
1aa70 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
1aa80 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
1aa90 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
1aaa0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
1aab0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
1aac0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
1aad0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
1aae0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
1aaf0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
1ab00 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
1ab10 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
1ab20 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
1ab30 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1ab40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
1ab50 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1ab60 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
1ab70 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
1ab80 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
1ab90 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
1aba0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1abb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1abc0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
1abd0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1abe0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
1abf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ac00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ac10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
1ac20 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
1ac30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ac40 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
1ac50 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
1ac60 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
1ac70 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
1ac80 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
1ac90 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
1aca0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1acb0 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
1acc0 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
1acd0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
1ace0 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61  int szPage = pPa
1acf0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1ad00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ad10 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
1ad20 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
1ad30 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
1ad40 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
1ad50 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
1ad60 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
1ad70 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1ad80 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
1ad90 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
1ada0 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a  ewSize = szPage*
1adb0 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
1adc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1add0 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
1ade0 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
1adf0 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
1ae00 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
1ae10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ae20 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1ae30 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
1ae40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1ae50 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
1ae60 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
1ae70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
1ae80 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
1ae90 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1aea0 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
1aeb0 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
1aec0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1aed0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
1aee0 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
1aef0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1af00 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
1af10 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
1af20 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
1af30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1af40 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1af50 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
1af60 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
1af70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1af80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1af90 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1afa0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
1afb0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
1afc0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1afd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1afe0 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
1aff0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
1b000 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
1b010 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
1b020 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1b030 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1b040 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
1b050 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
1b060 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
1b070 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
1b080 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
1b090 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
1b0a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
1b0b0 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
1b0c0 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
1b0d0 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
1b0e0 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
1b0f0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
1b100 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
1b110 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
1b120 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
1b130 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
1b140 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
1b150 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
1b160 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1b170 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
1b180 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
1b190 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
1b1a0 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
1b1b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1b1c0 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1b1d0 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
1b1e0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1b1f0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
1b200 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
1b210 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
1b220 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
1b230 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
1b240 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b250 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
1b260 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
1b270 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
1b280 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1b290 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
1b2a0 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
1b2b0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b2c0 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
1b2d0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
1b2e0 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
1b2f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1b300 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b310 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
1b320 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b330 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1b340 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
1b350 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32  rounded up to 32
1b360 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73   if.** it is les
1b370 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f  s than 32, or ro
1b380 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41  unded down to MA
1b390 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66  X_SECTOR_SIZE if
1b3a0 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65   it.** is greate
1b3b0 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f  r than MAX_SECTO
1b3c0 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  R_SIZE..**.** If
1b3d0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68   the file has th
1b3e0 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  e SQLITE_IOCAP_P
1b3f0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b400 54 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  TE property, the
1b410 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66  n set.** the eff
1b420 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1b430 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  ze to its minimu
1b440 6d 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20  m value (512).  
1b450 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a  The purpose of.*
1b460 2a 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  * pPager->sector
1b470 53 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e  Size is to defin
1b480 65 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64  e the "blast rad
1b490 69 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68  ius" of bytes th
1b4a0 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1b4b0 67 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63  ge if a crash oc
1b4c0 63 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69  curs while writi
1b4d0 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62  ng to a single b
1b4e0 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72  yte in.** that r
1b4f0 61 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20  ange.  But with 
1b500 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b510 49 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72  ITE, the blast r
1b520 61 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a  adius is zero.**
1b530 20 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50   (that is what P
1b540 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b550 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65  TE means), so we
1b560 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65   minimize the se
1b570 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46  ctor.** size.  F
1b580 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
1b590 70 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68  patibility of th
1b5a0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1b5b0 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a  al file format,.
1b5c0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64  ** we cannot red
1b5d0 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
1b5e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65  e sector size be
1b5f0 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74  low 512..*/.stat
1b600 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
1b610 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
1b620 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
1b630 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1b640 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1b650 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1b660 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1b670 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  e.   || (sqlite3
1b680 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1b690 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1b6a0 66 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20  fd) & .         
1b6b0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1b6c0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1b6d0 57 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20  WRITE)!=0.  ){. 
1b6e0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
1b6f0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
1b700 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1b710 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
1b720 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
1b730 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
1b740 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
1b750 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
1b760 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1b770 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
1b780 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ault. */.    pPa
1b790 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b7a0 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 512;.  }else{.
1b7b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1b7c0 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
1b7d0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1b7e0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  r->fd);.  }.}../
1b7f0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
1b800 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
1b810 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
1b820 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
1b830 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
1b840 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
1b850 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
1b860 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
1b870 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b880 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
1b890 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
1b8a0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
1b8b0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
1b8c0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
1b8d0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
1b8e0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b8f0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b900 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
1b910 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
1b920 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
1b930 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
1b940 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1b950 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
1b960 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
1b970 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
1b980 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
1b990 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
1b9a0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
1b9b0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b9c0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
1b9d0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
1b9e0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
1b9f0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
1ba00 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
1ba10 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1ba20 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1ba30 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
1ba40 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
1ba50 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
1ba60 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
1ba70 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1ba80 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1ba90 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
1baa0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
1bab0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
1bac0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
1bad0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
1bae0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1baf0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1bb00 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
1bb10 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
1bb20 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
1bb30 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
1bb40 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
1bb50 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
1bb60 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
1bb70 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
1bb80 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
1bb90 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
1bba0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
1bbb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1bbc0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
1bbd0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
1bbe0 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
1bbf0 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
1bc00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1bc10 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
1bc20 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
1bc30 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
1bc40 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
1bc50 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
1bc60 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
1bc70 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
1bc80 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
1bc90 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
1bca0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
1bcb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
1bcc0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
1bcd0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
1bce0 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
1bcf0 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
1bd00 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
1bd10 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
1bd20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1bd30 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
1bd40 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
1bd50 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
1bd60 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
1bd70 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
1bd80 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
1bd90 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
1bda0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1bdb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1bdc0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
1bdd0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
1bde0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
1bdf0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
1be00 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
1be10 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
1be20 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
1be30 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
1be40 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
1be50 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
1be60 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
1be70 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
1be80 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
1be90 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1bea0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1beb0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
1bec0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
1bed0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
1bee0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
1bef0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
1bf00 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
1bf10 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
1bf20 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
1bf30 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
1bf40 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
1bf50 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
1bf60 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
1bf70 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
1bf80 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
1bf90 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
1bfa0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
1bfb0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1bfc0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
1bfd0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
1bfe0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
1bff0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
1c000 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
1c010 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1c020 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
1c030 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
1c040 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
1c050 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
1c060 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
1c070 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
1c080 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
1c090 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
1c0a0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
1c0b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1c0c0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
1c0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
1c0e0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
1c0f0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1c100 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
1c110 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
1c120 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
1c130 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
1c140 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
1c150 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
1c160 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
1c170 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
1c180 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
1c190 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1c1a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
1c1b0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
1c1c0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1c1d0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
1c1e0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
1c1f0 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
1c200 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
1c210 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
1c220 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
1c230 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
1c240 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
1c250 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
1c260 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
1c270 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
1c280 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c290 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
1c2a0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
1c2b0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
1c2c0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
1c2d0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
1c2e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
1c2f0 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
1c300 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
1c310 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
1c320 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
1c330 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1c340 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
1c350 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c360 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1c370 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c390 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
1c3a0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
1c3b0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
1c3e0 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
1c3f0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1c420 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1c430 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
1c440 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c450 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1c460 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
1c470 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c490 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
1c4a0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1c4b0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
1c4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
1c4d0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
1c4e0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
1c4f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
1c500 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
1c510 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
1c520 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1c530 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
1c540 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
1c550 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
1c560 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
1c570 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
1c580 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e  lback */.  int n
1c590 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20  Playback = 0;   
1c5a0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1c5b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73  ber of pages res
1c5c0 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e  tored from journ
1c5d0 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  al */..  /* Figu
1c5e0 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1c5f0 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1c600 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1c610 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1c620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1c630 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1c640 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c650 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1c660 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1c670 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1c680 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1c690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c6a0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1c6b0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1c6c0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1c6d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1c6e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1c6f0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1c700 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1c710 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1c720 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1c730 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1c740 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1c750 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1c760 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1c770 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1c780 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1c790 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1c7a0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1c7b0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1c7c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1c7d0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1c7e0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1c7f0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1c800 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1c810 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1c820 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1c830 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1c840 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1c850 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1c860 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c870 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1c880 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61  c,.  ** mxPathna
1c890 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1c8a0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1c8b0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1c8c0 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1c8d0 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1c8e0 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1c8f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1c900 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1c910 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1c920 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1c930 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1c940 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1c950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c960 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1c970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1c980 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1c990 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1c9a0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1c9b0 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1c9c0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1c9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c9e0 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1c9f0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1ca00 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1ca10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1ca20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1ca30 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1ca40 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1ca50 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1ca60 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1ca70 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1ca80 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1ca90 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1caa0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1cab0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1cac0 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1cad0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1cae0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1caf0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1cb00 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1cb10 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1cb20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1cb30 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1cb40 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1cb50 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1cb60 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1cb70 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1cb80 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1cb90 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1cba0 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1cbb0 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1cbc0 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1cbd0 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1cbe0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1cbf0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1cc00 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1cc10 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1cc20 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1cc30 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1cc40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cc50 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1cc60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1cc70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cc80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1cc90 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1cca0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1ccb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1ccc0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1ccd0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1cce0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1ccf0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1cd00 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1cd10 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1cd20 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1cd30 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1cd40 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1cd50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1cd60 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1cd70 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1cd80 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1cd90 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1cda0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1cdb0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1cdc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1cdd0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1cde0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1cdf0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1ce00 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1ce10 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1ce20 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1ce30 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1ce40 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1ce50 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1ce60 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1ce70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1ce80 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1ce90 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1cea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1ceb0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1cec0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1ced0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1cee0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1cef0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1cf00 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1cf10 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1cf20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1cf30 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1cf40 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1cf50 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1cf60 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1cf70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1cf80 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1cf90 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1cfa0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1cfb0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1cfc0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1cfd0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1cfe0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1cff0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1d000 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1d010 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1d020 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1d030 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1d040 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1d050 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1d060 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1d070 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1d080 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1d090 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1d0a0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1d0b0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1d0c0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1d0d0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1d0e0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1d0f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1d100 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1d110 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1d120 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1d130 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1d140 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1d150 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1d160 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1d170 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1d180 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1d190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1d1a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1d1b0 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1d1c0 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1d1d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1d1e0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1d1f0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1d200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1d210 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1d220 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1d230 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1d240 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1d250 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1d260 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1d270 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1d280 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1d290 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1d2a0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1d2b0 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1d2c0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1d2d0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1d2e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1d2f0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1d300 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1d310 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1d320 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1d330 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1d340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1d360 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1d370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d380 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d390 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1d3a0 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1d3b0 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1d3c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1d3d0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1d3e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1d3f0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1d400 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1d410 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1d420 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1d430 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1d440 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1d450 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1d460 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1d470 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1d480 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d490 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1d4a0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1d4b0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1d4c0 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1d4d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d4e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1d4f0 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1d500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d520 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1d530 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1d540 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1d550 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d560 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1d570 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1d580 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1d590 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d5a0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1d5b0 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1d5c0 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1d5d0 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1d5e0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1d5f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1d600 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1d610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1d620 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1d630 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1d640 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1d650 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1d660 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1d670 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1d680 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1d690 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1d6a0 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1d6b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1d6c0 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1d6d0 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1d6e0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1d6f0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1d700 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d710 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1d720 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1d730 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d740 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1d750 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1d760 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1d770 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1d780 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1d790 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1d7a0 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1d7b0 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1d7c0 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1d7d0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1d7e0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1d7f0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1d800 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1d810 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1d820 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1d830 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1d840 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1d850 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1d860 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1d870 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d880 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1d890 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d8a0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1d8b0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1d8c0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1d8d0 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1d8e0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1d8f0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1d900 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1d910 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1d920 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1d930 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1d940 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1d950 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1d960 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1d970 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1d980 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1d990 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1d9a0 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1d9b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d9c0 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1d9d0 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1d9e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1d9f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1da00 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1da10 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1da20 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1da30 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1da40 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1da50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1da60 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1da70 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1da80 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1da90 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1daa0 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1dab0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1dac0 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1dad0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1dae0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1daf0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1db00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1db10 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1db20 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1db30 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1db40 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1db50 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1db60 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1db70 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1db80 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1db90 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1dba0 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1dbb0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1dbc0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1dbd0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1dbe0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1dbf0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1dc00 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1dc10 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1dc20 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1dc30 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1dc40 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1dc50 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1dc60 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1dc70 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1dc80 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1dc90 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1dca0 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1dcb0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1dcc0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1dcd0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1dce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dcf0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1dd00 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1dd10 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1dd20 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1dd30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1dd40 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1dd50 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1dd60 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dd70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dd80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dd90 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1dda0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1ddb0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1ddc0 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1ddd0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1dde0 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1ddf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1de00 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1de10 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1de20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1de30 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1de40 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1de50 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1de60 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1de70 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1de80 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1de90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dea0 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1deb0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1dec0 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1ded0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1dee0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1def0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1df00 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1df10 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1df20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1df30 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1df40 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1df50 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1df60 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1df70 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1df80 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1df90 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1dfa0 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1dfb0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1dfc0 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1dfd0 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1dfe0 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1dff0 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1e000 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1e010 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1e020 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1e030 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1e040 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1e050 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1e060 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1e070 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1e080 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1e090 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1e0a0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1e0b0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1e0c0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1e0d0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1e0e0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1e0f0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1e100 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1e110 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1e120 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1e130 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1e140 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1e150 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e160 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1e170 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1e180 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1e190 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1e1a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e1b0 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1e1c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e1d0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1e1e0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1e1f0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1e200 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1e210 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1e220 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1e230 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1e240 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e250 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1e260 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1e270 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1e280 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e290 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1e2a0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1e2b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1e2c0 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1e2d0 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1e2e0 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1e2f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e300 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1e310 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1e320 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1e330 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1e340 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1e350 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1e360 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1e370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e380 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1e390 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e3a0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1e3b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1e3c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e3d0 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1e3e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e3f0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1e400 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1e410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1e420 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1e430 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1e440 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1e450 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1e460 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1e470 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1e480 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1e490 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1e4a0 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1e4b0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e4c0 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1e4d0 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1e4e0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 23 69  se.#endif.  {.#i
1e4f0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
1e500 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20 20 75  ER_EDITION.    u
1e510 38 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  8 *pData = 0;.  
1e520 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72    if( pagerIsSer
1e530 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20  ver(pPager) ){. 
1e540 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 72 76       sqlite3Serv
1e550 65 72 52 65 61 64 50 61 67 65 28 70 50 61 67 65  erReadPage(pPage
1e560 72 2d 3e 70 53 65 72 76 65 72 2c 20 70 67 6e 6f  r->pServer, pgno
1e570 2c 20 26 70 44 61 74 61 29 3b 0a 20 20 20 20 20  , &pData);.     
1e580 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1e590 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 67        memcpy(pPg
1e5a0 2d 3e 70 44 61 74 61 2c 20 70 44 61 74 61 2c 20  ->pData, pData, 
1e5b0 70 67 73 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgsz);.      }. 
1e5c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 44 61     }.    if( pDa
1e5d0 74 61 3d 3d 30 20 29 7b 0a 23 65 6e 64 69 66 0a  ta==0 ){.#endif.
1e5e0 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 73 65        i64 iOffse
1e5f0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1e600 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1e610 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ze;.      rc = s
1e620 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1e630 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
1e640 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73  ata, pgsz, iOffs
1e650 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  et);.      if( r
1e660 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1e670 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1e680 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e690 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  E_OK;.      }.#i
1e6a0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
1e6b0 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20 20 20  ER_EDITION.     
1e6c0 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72 76   if( pagerIsServ
1e6d0 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  er(pPager) ){.  
1e6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 72        sqlite3Ser
1e6f0 76 65 72 45 6e 64 52 65 61 64 50 61 67 65 28 70  verEndReadPage(p
1e700 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72 2c 20  Pager->pServer, 
1e710 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
1e720 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d     }.#endif..  }
1e730 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
1e740 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
1e750 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1e760 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
1e770 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
1e780 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
1e790 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
1e7a0 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
1e7b0 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
1e7c0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
1e7d0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
1e7e0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
1e7f0 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
1e800 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
1e810 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
1e820 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
1e830 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
1e840 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e850 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
1e860 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
1e870 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
1e880 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
1e890 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
1e8a0 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
1e8b0 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
1e8c0 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
1e8d0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
1e8e0 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
1e8f0 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
1e900 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e910 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
1e920 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
1e930 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
1e940 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
1e950 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
1e960 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1e970 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
1e980 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
1e990 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
1e9a0 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
1e9b0 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  e equaling 16 by
1e9c0 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1e9d0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1e9e0 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1e9f0 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1ea00 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1ea10 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1ea20 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1ea30 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1ea40 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1ea50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ea60 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1ea70 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1ea80 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1ea90 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1eaa0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1eab0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1eac0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1ead0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1eae0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1eaf0 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e   pPg->pData, pgn
1eb00 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54  o, 3, rc = SQLIT
1eb10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a  E_NOMEM_BKPT);..
1eb20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1eb30 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1eb40 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1eb50 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1eb60 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1eb70 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1eb80 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1eb90 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1eba0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1ebb0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1ebc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ebd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1ebe0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1ebf0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1ec00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ec10 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1ec20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1ec30 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1ec40 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1ec50 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1ec60 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1ec70 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1ec80 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1ec90 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1eca0 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1ecb0 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1ecc0 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1ecd0 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1ece0 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1ecf0 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1ed00 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1ed10 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1ed20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1ed30 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1ed40 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1ed50 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1ed60 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1ed70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ed80 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1ed90 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1eda0 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1edb0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1edc0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1edd0 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1ede0 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1edf0 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1ee00 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1ee10 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1ee20 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1ee30 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ee40 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1ee50 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1ee60 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1ee70 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1ee80 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1ee90 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1eea0 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1eeb0 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1eec0 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1eed0 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1eee0 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1eef0 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1ef00 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1ef10 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1ef20 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1ef30 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1ef40 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1ef50 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1ef60 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1ef70 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1ef80 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1ef90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1efa0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1efb0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1efc0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1efd0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1efe0 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1eff0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1f000 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1f010 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1f020 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1f030 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1f040 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1f050 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1f060 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1f070 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1f080 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1f090 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1f0a0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1f0b0 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1f0c0 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1f0d0 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1f0e0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1f0f0 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1f100 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1f110 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1f120 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1f130 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1f140 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1f150 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1f160 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1f170 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1f180 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1f190 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1f1a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f1b0 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1f1c0 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1f1d0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1f1e0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1f1f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1f200 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1f210 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1f220 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1f230 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f240 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1f250 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1f260 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1f270 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1f280 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1f290 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1f2a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1f2b0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1f2c0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1f2d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1f2e0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1f2f0 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1f300 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1f310 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1f320 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69  lse{.      u32 i
1f330 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  Frame = 0;.     
1f340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1f350 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1f360 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1f370 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1f380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f3a0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1f3b0 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
1f3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f3d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f3e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1f3f0 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1f400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f420 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
1f430 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1f440 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1f450 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1f460 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1f470 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1f480 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1f490 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1f4a0 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1f4b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1f4c0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1f4d0 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1f4e0 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1f4f0 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1f500 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1f510 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1f520 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1f530 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1f540 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1f550 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1f560 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1f570 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1f580 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1f590 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1f5a0 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1f5b0 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1f5c0 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1f5d0 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1f5e0 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1f5f0 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1f600 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1f610 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1f620 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1f630 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1f640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f660 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1f670 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1f680 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1f690 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1f6a0 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1f6b0 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1f6c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f6d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f6f0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1f700 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f720 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1f730 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1f740 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1f750 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1f760 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1f770 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1f780 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1f790 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1f7a0 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1f7b0 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1f7c0 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1f7d0 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1f7e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1f7f0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1f800 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1f810 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1f820 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1f830 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1f840 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1f850 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1f860 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1f870 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1f880 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1f890 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1f8a0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1f8b0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1f8c0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1f8d0 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1f8e0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1f8f0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1f900 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1f910 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1f920 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1f930 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1f940 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1f950 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1f960 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1f970 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1f980 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1f990 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1f9a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f9b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f9c0 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1f9d0 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1f9e0 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1f9f0 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1fa00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1fa10 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1fa20 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1fa30 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1fa40 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1fa50 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1fa60 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1fa70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1fa80 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1fa90 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1faa0 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1fab0 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1fac0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1fad0 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1fae0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1faf0 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1fb00 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1fb10 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1fb20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1fb30 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1fb40 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1fb50 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1fb60 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1fb80 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1fb90 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1fbc0 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1fbd0 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fbf0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1fc00 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1fc10 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1fc20 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1fc30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fc40 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1fc50 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1fc60 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1fc70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1fc80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1fc90 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fcb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1fcc0 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20  s in pList */.  
1fcd0 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1fd00 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20  ver pages */..  
1fd10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fd20 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1fd30 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1fd40 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1fd50 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1fd60 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1fd70 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1fd80 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1fd90 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1fda0 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1fdb0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1fdc0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1fdd0 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1fde0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1fdf0 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1fe00 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1fe10 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1fe20 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1fe30 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1fe40 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1fe50 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1fe60 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1fe70 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1fe80 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1fe90 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1fea0 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1feb0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1fec0 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1fed0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1fee0 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1fef0 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1ff00 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1ff10 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1ff20 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1ff30 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1ff40 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1ff50 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1ff60 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1ff70 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1ff80 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1ff90 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1ffa0 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1ffb0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1ffc0 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1ffd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ffe0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1fff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
20000 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
20010 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
20020 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
20030 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
20040 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
20050 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
20060 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
20070 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
20080 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
20090 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
200a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
200b0 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
200c0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
200d0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
200e0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
200f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
20100 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
20110 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
20120 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
20130 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
20140 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
20150 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
20160 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
20170 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
20180 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20190 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
201a0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
201b0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
201c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
201d0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
201e0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
201f0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
20200 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
20210 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
20220 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
20230 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
20240 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
20250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20260 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
20270 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
20280 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
20290 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
202a0 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
202b0 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
202c0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
202d0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
202e0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
202f0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
20300 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
20310 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
20320 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
20330 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
20340 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
20350 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
20360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20370 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
20380 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
20390 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
203a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
203b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
203c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
203d0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
203e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
203f0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
20400 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
20410 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
20420 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20440 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
20450 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
20460 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
20470 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
20480 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
20490 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
204a0 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
204b0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
204c0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
204d0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
204e0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
204f0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
20500 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
20510 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
20520 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
20530 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
20540 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
20550 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
20560 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
20570 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
20580 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
20590 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
205a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
205b0 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
205c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
205d0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
205e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
205f0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
20600 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
20610 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
20620 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
20630 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
20640 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
20650 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
20660 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20670 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
20680 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20690 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
206a0 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
206b0 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
206c0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
206d0 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
206e0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
206f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20700 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
20710 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
20720 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
20730 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
20740 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
20750 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
20760 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
20770 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
20780 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
20790 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
207a0 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
207b0 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
207c0 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
207d0 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
207e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
207f0 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
20800 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
20810 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
20820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
20830 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
20840 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
20850 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
20860 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
20870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
20880 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
20890 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
208a0 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
208b0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
208c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
208d0 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
208e0 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
208f0 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
20900 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
20910 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
20920 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
20930 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
20940 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
20950 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
20960 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
20970 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
20980 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
20990 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
209a0 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
209b0 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
209c0 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
209d0 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
209e0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
209f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20a00 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
20a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20a20 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
20a30 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
20a40 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
20a50 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
20a60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
20a70 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50  pFile==0 );.  nP
20a80 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
20a90 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
20aa0 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
20ab0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
20ac0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
20ad0 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  se is not availa
20ae0 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ble from the.  *
20af0 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  * WAL sub-system
20b00 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  , determine the 
20b10 70 61 67 65 20 63 6f 75 6e 74 20 62 61 73 65 64  page count based
20b20 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   on the size of.
20b30 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
20b40 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  e file.  If the 
20b50 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20b60 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
20b70 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
20b80 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
20b90 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e   page-size, roun
20ba0 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e  d up the result.
20bb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
20bc0 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69  e==0 && ALWAYS(i
20bd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
20be0 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  )) ){.    i64 n 
20bf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
20c00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20c10 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
20c20 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  tes */.    int r
20c30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
20c40 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
20c50 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28 20 72  , &n);.    if( r
20c60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20c80 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
20c90 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
20ca0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
20cb0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
20cc0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
20cd0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
20ce0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
20cf0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
20d00 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
20d10 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
20d20 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
20d30 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
20d40 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
20d50 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
20d60 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
20d70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
20d80 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
20d90 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
20da0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
20db0 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
20dc0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
20dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20de0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
20df0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
20e00 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
20e10 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
20e20 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
20e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
20e40 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
20e50 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
20e60 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20e70 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
20e80 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
20e90 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
20ea0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
20eb0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
20ec0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
20ed0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
20ee0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20ef0 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
20f00 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
20f10 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
20f20 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
20f30 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
20f40 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
20f50 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
20f60 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
20f70 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
20f80 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
20f90 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
20fa0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
20fb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20fc0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
20fd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
20fe0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
20ff0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
21000 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
21010 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
21020 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
21030 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
21040 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
21050 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
21060 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
21070 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
21080 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
21090 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
210a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
210b0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
210c0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
210d0 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
210e0 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
210f0 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
21100 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
21110 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
21120 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
21130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21140 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
21150 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
21160 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
21170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
21180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
21190 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
211a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
211b0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
211c0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
211d0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
211e0 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
211f0 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
21200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21210 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
21220 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  sts */.    rc = 
21230 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
21240 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21250 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
21260 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
21270 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
21280 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
21290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
212a0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61  {.      if( isWa
212b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
212c0 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
212d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
212e0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
212f0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
21300 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
21310 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21320 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &nPage);.       
21330 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
21340 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
21350 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
21360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21370 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
21380 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
21390 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
213a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
213b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
213c0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
213d0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
213e0 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
213f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21400 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
21410 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
21420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21430 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
21440 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
21450 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
21460 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
21470 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
21480 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
21490 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
214a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
214b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
214c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
214d0 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
214e0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
214f0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
21500 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
21510 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
21520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21530 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
21540 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
21550 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
21560 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
21570 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
21580 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
21590 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
215a0 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
215b0 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
215c0 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
215d0 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
215e0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
215f0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
21600 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
21610 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
21620 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
21630 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
21640 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
21650 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
21660 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
21670 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
21680 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
21690 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
216a0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
216b0 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
216c0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
216d0 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
216e0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
216f0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21700 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
21710 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
21720 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
21730 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
21740 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21750 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
21760 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
21770 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21780 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
21790 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
217a0 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
217b0 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
217c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
217d0 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
217e0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
217f0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
21800 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
21810 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
21820 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
21830 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
21840 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
21850 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
21860 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
21870 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
21880 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
21890 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
218a0 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
218b0 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
218c0 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
218d0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
218e0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
218f0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
21900 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
21910 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
21920 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
21930 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
21940 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
21950 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
21960 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
21970 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
21980 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
21990 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
219a0 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
219b0 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
219c0 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
219d0 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
219e0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
219f0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
21a00 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
21a10 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
21a20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
21a30 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
21a40 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
21a50 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
21a60 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
21a70 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
21a80 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
21a90 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
21aa0 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
21ab0 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
21ac0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
21ad0 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
21ae0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
21af0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21b00 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
21b10 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
21b20 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
21b30 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
21b40 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
21b50 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
21b60 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
21b70 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21b80 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
21b90 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
21ba0 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
21bb0 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
21bc0 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
21bd0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
21be0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
21bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21c00 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
21c10 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
21c20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
21c30 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
21c40 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
21c50 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
21c60 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
21c70 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
21c80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
21c90 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21ca0 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
21cb0 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
21cc0 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
21cd0 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
21ce0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
21cf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21d00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
21d10 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
21d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21d30 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
21d40 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
21d50 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
21d60 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
21d70 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
21d80 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
21d90 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
21da0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
21db0 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
21dc0 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
21dd0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
21de0 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
21df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21e00 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
21e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21e20 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
21e30 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
21e40 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
21e50 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
21e60 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
21e70 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
21e80 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
21e90 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
21ea0 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
21eb0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
21ec0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
21ed0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
21ee0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
21ef0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
21f00 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
21f10 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
21f20 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21f30 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
21f40 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
21f50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
21f60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21f70 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
21f80 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21f90 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
21fa0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
21fb0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
21fc0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
21fd0 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
21fe0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21ff0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
22000 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
22010 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
22020 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
22030 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22040 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
22050 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
22060 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
22070 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
22080 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
22090 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
220a0 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
220b0 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
220c0 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
220d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
220e0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
220f0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
22100 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
22110 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
22120 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
22130 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
22140 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
22150 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
22160 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
22170 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
22180 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
22190 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
221a0 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
221b0 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
221c0 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
221d0 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
221e0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
221f0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
22200 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
22210 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
22220 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
22230 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
22240 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
22250 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
22260 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
22270 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
22280 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
22290 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
222a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
222b0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
222c0 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
222d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
222e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
222f0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
22300 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
22310 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
22320 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
22330 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
22340 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
22350 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22360 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22380 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22390 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
223a0 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
223b0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
223c0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
223d0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
223e0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
223f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
22400 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
22410 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
22420 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
22430 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
22440 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
22450 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
22460 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
22470 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
22480 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
22490 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
224a0 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
224b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
224c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
224d0 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
224e0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
224f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22500 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
22510 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
22520 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
22530 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
22540 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
22550 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
22560 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
22570 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
22580 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
22590 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
225a0 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
225b0 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
225c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
225d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
225e0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
225f0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
22600 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
22610 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
22620 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
22630 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
22640 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
22650 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
22660 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
22670 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
22680 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
22690 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
226a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
226b0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
226c0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
226d0 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
226e0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
226f0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
22700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
22710 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
22720 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
22730 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
22740 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
22750 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
22760 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
22770 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
22780 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
22790 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
227a0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
227b0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
227c0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
227d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
227e0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
227f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22800 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
22810 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
22820 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
22830 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
22840 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
22850 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
22860 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
22870 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
22880 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
22890 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
228a0 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
228b0 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
228c0 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
228d0 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
228e0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
228f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
22900 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
22910 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22920 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22930 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
22940 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
22950 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
22960 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
22970 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
22980 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
22990 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
229a0 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
229b0 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
229c0 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
229d0 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
229e0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
229f0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
22a00 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
22a10 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
22a20 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
22a30 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
22a40 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
22a50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22a60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
22a70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22a80 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
22a90 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
22aa0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
22ab0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22ac0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
22ad0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
22ae0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
22af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22b00 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
22b10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
22b20 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
22b30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22b40 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22b50 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22b60 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22b70 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22b80 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22b90 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65  g to recycle cle
22ba0 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61  an and unused pa
22bb0 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
22bc0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
22bd0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
22be0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
22bf0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
22c00 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
22c10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22c20 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22c30 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22c40 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
22c50 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
22c60 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
22c70 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
22c80 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67  ing to spill pag
22c90 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  es to journal..*
22ca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22cb0 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50  erSetSpillsize(P
22cc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22cd0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
22ce0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
22cf0 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50  eSetSpillsize(pP
22d00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22d10 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22d20 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46   Invoke SQLITE_F
22d30 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62  CNTL_MMAP_SIZE b
22d40 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
22d50 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d  ent value of szM
22d60 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
22d70 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
22d80 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
22d90 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  er){.#if SQLITE_
22da0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
22db0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22dc0 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
22dd0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
22de0 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64  ) && fd->pMethod
22df0 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
22e00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
22e10 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d  t64 sz;.    sz =
22e20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b   pPager->szMmap;
22e30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73  .    pPager->bUs
22e40 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b  eFetch = (sz>0);
22e50 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
22e60 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
22e70 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
22e80 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
22e90 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
22ea0 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
22eb0 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
22ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22ed0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
22ee0 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
22ef0 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
22f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22f10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22f20 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
22f30 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22f40 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22f50 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
22f60 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
22f70 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
22f80 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
22f90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
22fa0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
22fb0 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
22fc0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
22fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
22fe0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
22ff0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
23000 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
23010 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
23020 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
23030 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
23040 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
23050 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
23060 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
23070 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
23080 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
23090 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
230a0 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
230b0 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
230c0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
230d0 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
230e0 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
230f0 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
23100 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
23110 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
23120 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
23130 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
23140 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76  ere are four lev
23150 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
23160 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
23170 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
23180 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
23190 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
231b0 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
231c0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
231d0 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
231e0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
231f0 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
23200 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
23210 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
23220 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
23230 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
23240 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
23250 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
23260 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
23270 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
23280 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
23290 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
232a0 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
232b0 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
232c0 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
232d0 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
232e0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
232f0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
23300 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
23310 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
23320 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
23330 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23340 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
23350 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
23360 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
23370 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
23380 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
23390 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
233a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
233b0 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
233c0 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
233d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
233e0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
23400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
23410 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
23420 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
23430 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
23440 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
23450 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
23460 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
23470 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
23480 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
23490 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
234a0 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
234b0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
234c0 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
234d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
234e0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
234f0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
23500 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
23510 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
23520 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
23530 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
23540 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52  k..**.**    EXTR
23550 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69  A     This is li
23560 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74  ke FULL except t
23570 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63  hat is also sync
23580 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  s the directory.
23590 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
235a0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
235b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
235c0 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c  al after the rol
235d0 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20  lback.**        
235e0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73        journal is
235f0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a   unlinked..**.**
23600 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
23610 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
23620 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
23630 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
23640 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
23650 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
23660 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
23670 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
23680 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
23690 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
236a0 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
236b0 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
236c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
236d0 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
236e0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
236f0 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
23700 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
23710 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
23720 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
23730 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
23740 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
23750 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
23760 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
23770 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
23780 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
23790 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
237a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
237b0 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
237c0 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
237d0 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
237e0 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
237f0 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
23800 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
23810 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72  th NORMAL.  Ther
23820 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
23830 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a  ce between FULL.
23840 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72  ** and EXTRA for
23850 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
23860 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
23870 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
23880 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
23890 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
238a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
238b0 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
238c0 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
238d0 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
238e0 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
238f0 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
23900 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23910 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
23920 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
23930 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
23940 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
23950 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
23960 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
23970 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
23980 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
23990 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
239a0 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
239b0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
239c0 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
239d0 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
239e0 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
239f0 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
23a00 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
23a10 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
23a20 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
23a30 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
23a40 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
23a50 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
23a60 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
23a70 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
23a80 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
23a90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23aa0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
23ab0 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
23ac0 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
23ad0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23ae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
23af0 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
23b00 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
23b10 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
23b20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
23b30 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
23b40 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
23b50 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23b60 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
23b70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23b80 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
23b90 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
23ba0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
23bb0 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
23bc0 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
23bd0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
23be0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
23bf0 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50  Sync =  level==P
23c00 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
23c10 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70  _OFF ?1:0;.    p
23c20 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23c30 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53  = level>=PAGER_S
23c40 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20  YNCHRONOUS_FULL 
23c50 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
23c60 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65  ->extraSync = le
23c70 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23c80 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a  RONOUS_EXTRA ?1:
23c90 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
23ca0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
23cb0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23cc0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50  lags = 0;.    pP
23cd0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23ce0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
23cf0 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
23d00 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29  AGER_FULLFSYNC )
23d10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
23d20 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23d30 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
23d40 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
23d50 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
23d60 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
23d70 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
23d80 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46  PAGER_CKPT_FULLF
23d90 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
23da0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23db0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23dc0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
23dd0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
23de0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23df0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
23e00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23e10 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
23e20 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
23e30 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
23e40 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
23e50 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
23e60 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
23e70 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
23e80 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
23e90 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
23ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23eb0 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c  SyncFlags |= WAL
23ec0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
23ed0 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NS;.  }.  if( pg
23ee0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
23ef0 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
23f00 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23f10 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
23f20 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
23f30 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23f40 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
23f50 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
23f60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
23f70 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
23f80 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
23f90 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
23fa0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
23fb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
23fc0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
23fd0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
23fe0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23ff0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
24000 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
24010 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
24020 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
24030 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
24040 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
24050 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
24060 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
24070 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
24080 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
24090 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
240a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
240b0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
240c0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
240d0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
240e0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
240f0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
24100 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
24110 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
24120 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
24130 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
24140 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
24150 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
24160 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
24170 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
24180 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
24190 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
241a0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
241b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
241c0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
241d0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
241e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
241f0 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
24200 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
24210 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
24220 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
24230 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
24240 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24250 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
24260 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
24270 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
24280 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
24290 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
242a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
242b0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
242c0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
242d0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
242e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24300 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24310 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
24320 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
24330 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
24340 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
24350 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
24360 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
24370 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
24380 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
24390 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
243a0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
243b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
243c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
243d0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
243e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
243f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
24400 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
24410 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
24420 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
24430 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
24440 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
24450 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
24460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
24470 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
24480 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
24490 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
244a0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
244b0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
244c0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
244d0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
244e0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
244f0 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
24500 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
24510 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
24520 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
24530 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
24540 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
24550 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
24560 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
24570 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
24580 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
24590 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
245a0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
245b0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
245c0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
245d0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
245e0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
245f0 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
24600 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
24610 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
24620 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24640 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
24650 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
24660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24690 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
246a0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
246b0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
246c0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
246d0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
246e0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
246f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
24700 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
24710 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
24720 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
24730 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
24740 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
24750 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
24760 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
24770 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
24780 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
24790 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
247a0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
247b0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
247c0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
247d0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
247e0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
247f0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
24800 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
24810 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
24820 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24840 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
24850 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
24860 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
24870 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
24880 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
24890 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
248a0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
248b0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248d0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
248e0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
248f0 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
24900 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
24910 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
24920 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
24930 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
24940 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
24950 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24960 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
24970 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
24980 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
24990 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
249a0 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
249b0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
249c0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
249d0 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
249e0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
249f0 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
24a00 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
24a10 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
24a20 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
24a30 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
24a40 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
24a50 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
24a60 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
24a70 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
24a80 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
24a90 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
24aa0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
24ab0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
24ac0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
24ad0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
24ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24af0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
24b00 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
24b10 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
24b20 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
24b30 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
24b40 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
24b50 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
24b60 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
24b70 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
24b80 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
24b90 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
24ba0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
24bb0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
24bc0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
24bd0 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
24be0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
24bf0 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
24c00 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
24c10 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
24c20 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
24c30 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
24c40 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
24c50 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
24c60 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
24c70 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
24c80 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
24c90 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
24ca0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
24cb0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
24cc0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
24cd0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
24ce0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
24cf0 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
24d00 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
24d10 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
24d20 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
24d30 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
24d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24d50 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
24d60 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
24d70 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
24d80 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
24d90 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
24da0 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
24db0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
24dc0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
24dd0 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
24de0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
24df0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
24e00 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
24e10 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
24e20 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
24e30 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
24e40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
24e50 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
24e60 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
24e70 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
24e80 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
24e90 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
24ea0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
24eb0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
24ec0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
24ed0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
24ee0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
24ef0 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
24f00 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
24f10 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24f20 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
24f30 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
24f40 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
24f50 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
24f60 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
24f70 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
24f80 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
24f90 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
24fa0 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
24fb0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
24fc0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
24fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
24fe0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
24ff0 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
25000 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
25010 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
25020 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
25030 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
25040 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
25050 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
25060 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
25070 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
25080 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
25090 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
250a0 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
250b0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
250c0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
250d0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
250e0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
250f0 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
25100 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
25110 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
25120 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
25130 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
25140 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
25150 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
25160 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
25170 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
25180 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
25190 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
251a0 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
251b0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
251c0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
251d0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
251e0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
251f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
25200 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
25210 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
25220 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
25230 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
25240 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
25250 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
25260 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
25270 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
25280 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
25290 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
252a0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
252b0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
252c0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
252d0 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
252e0 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
252f0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
25300 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
25310 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
25320 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
25330 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
25340 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
25350 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
25360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
25380 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
25390 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
253a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
253b0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
253c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
253d0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
253e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
253f0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
25400 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
25410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25420 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
25430 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
25440 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
25450 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
25460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25470 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
25480 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
25490 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
254a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
254b0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
254c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
254d0 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
254e0 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
254f0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
25500 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
25510 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
25520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
25530 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
25540 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
25550 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
25560 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
25570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25580 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
25590 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
255a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
255b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
255c0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
255d0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
255e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
255f0 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
25600 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
25610 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
25620 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
25630 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
25640 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25660 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25670 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
25680 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
25690 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
256a0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
256b0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
256c0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
256d0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
256e0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
256f0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
25700 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
25710 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
25720 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
25730 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
25740 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
25750 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
25760 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
25770 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
25780 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
25790 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
257a0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
257b0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
257c0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
257d0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
257e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
257f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
25800 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
25810 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
25820 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
25830 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
25840 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
25850 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
25860 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
25870 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
25880 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
25890 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
258a0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
258b0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
258c0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
258d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
258e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
258f0 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
25900 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
25910 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
25920 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
25930 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
25940 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
25950 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
25960 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
25970 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
25980 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
25990 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
259a0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
259b0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
259c0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
259d0 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
259e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
259f0 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
25a00 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
25a10 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
25a20 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
25a30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
25a40 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
25a50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
25a60 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
25a70 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
25a80 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
25a90 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
25aa0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
25ab0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
25ac0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
25ad0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
25ae0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
25af0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
25b00 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
25b10 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
25b20 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
25b30 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
25b40 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
25b50 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
25b60 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
25b70 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
25b80 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
25b90 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
25ba0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
25bb0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25bc0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
25bd0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
25be0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
25bf0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25c00 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
25c10 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
25c20 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
25c30 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25c40 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
25c50 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
25c60 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
25c70 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
25c80 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
25c90 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
25ca0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
25cb0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
25cc0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
25cd0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
25ce0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25cf0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
25d00 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
25d10 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
25d20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
25d30 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
25d40 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
25d50 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
25d60 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
25d70 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
25d80 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
25d90 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
25da0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
25db0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
25dc0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
25dd0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
25de0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
25df0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
25e00 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
25e10 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
25e20 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
25e30 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25e40 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
25e50 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
25e60 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
25e70 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
25e80 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
25e90 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
25ea0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
25eb0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
25ec0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
25ed0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
25ee0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
25ef0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
25f00 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
25f10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
25f20 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
25f30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25f40 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
25f50 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
25f60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25f70 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
25f80 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
25f90 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
25fa0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
25fb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25fc0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
25fd0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
25fe0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
25ff0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
26000 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
26010 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
26020 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
26030 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
26040 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
26050 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
26060 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
26070 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
26080 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
26090 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
260a0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
260b0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
260c0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
260d0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
260e0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
260f0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
26100 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
26110 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
26120 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
26130 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
26140 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
26150 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26160 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
26170 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
26180 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26190 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
261a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
261b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
261c0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
261d0 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
261e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
261f0 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
26200 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
26210 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
26220 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
26230 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
26240 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
26250 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
26260 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
26270 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
26280 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
26290 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
262a0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
262b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
262c0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
262d0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
262e0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
262f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
26300 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
26310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26320 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
26330 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
26340 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
26350 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
26360 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
26370 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
26380 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
26390 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
263a0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
263b0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
263c0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
263d0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
263e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
263f0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
26400 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
26410 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
26420 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
26430 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
26440 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
26450 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
26460 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
26470 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
26480 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
26490 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
264a0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
264b0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
264c0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
264d0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
264e0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
264f0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
26500 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
26510 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26520 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
26530 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
26540 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
26550 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
26560 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
26570 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
26580 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
26590 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
265a0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
265b0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
265c0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
265d0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
265e0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
265f0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
26600 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26630 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
26640 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
26650 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
26660 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
26670 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
26680 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
26690 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
266a0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
266b0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
266c0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
266d0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
266e0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
266f0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
26700 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
26710 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
26720 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
26730 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
26740 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
26750 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
26760 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
26770 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
26780 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
26790 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
267a0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
267b0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
267c0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
267d0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
267e0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
267f0 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
26800 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
26810 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
26820 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
26830 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
26840 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
26850 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
26860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
26870 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
26880 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
26890 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
268a0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
268b0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
268c0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
268d0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
268e0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
268f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
26900 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
26910 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
26920 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
26930 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
26940 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
26950 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
26960 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
26970 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
26980 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
26990 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
269a0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
269b0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
269c0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
269d0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
269e0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
269f0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
26a00 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
26a10 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
26a20 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
26a30 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
26a40 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
26a50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
26a60 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
26a70 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
26a80 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
26a90 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
26aa0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
26ab0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
26ac0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
26ad0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
26ae0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
26af0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
26b00 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
26b10 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
26b20 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
26b30 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
26b40 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
26b50 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
26b60 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
26b70 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
26b80 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
26b90 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
26ba0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
26bb0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
26bc0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
26bd0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
26be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26bf0 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
26c00 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
26c10 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
26c20 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
26c30 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
26c40 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
26c50 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
26c60 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
26c70 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
26c80 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
26c90 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
26ca0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
26cb0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
26cc0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
26cd0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
26ce0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
26cf0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
26d00 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26d10 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
26d20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
26d30 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
26d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
26d50 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
26d60 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
26d70 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
26d80 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
26d90 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
26da0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26db0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26dc0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26dd0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
26de0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
26df0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26e00 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
26e10 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
26e20 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26e30 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
26e40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
26e50 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
26e60 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
26e70 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
26e80 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
26e90 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
26ea0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
26eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26ec0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
26ed0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
26ee0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
26ef0 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
26f00 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
26f10 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
26f20 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
26f30 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
26f40 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
26f50 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
26f60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
26f70 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
26f80 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26f90 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
26fa0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
26fb0 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
26fc0 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
26fd0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
26fe0 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
26ff0 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
27000 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
27010 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
27020 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
27030 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
27040 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
27050 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
27060 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
27070 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
27080 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
27090 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
270a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
270b0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
270c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
270d0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
270e0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
270f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
27100 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
27110 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
27120 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
27130 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
27140 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
27150 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
27160 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
27170 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
27180 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
27190 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
271a0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
271b0 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
271c0 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
271d0 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
271e0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
271f0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
27200 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
27210 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
27220 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
27230 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
27240 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
27250 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
27260 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
27270 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
27280 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
27290 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
272a0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
272b0 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
272c0 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
272d0 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
272e0 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
272f0 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
27300 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
27310 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
27320 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
27330 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
27340 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
27350 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
27360 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27370 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
27380 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
27390 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
273a0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
273b0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
273c0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
273d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
273e0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
273f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
27400 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
27410 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
27420 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
27430 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
27440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
27450 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
27460 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
27470 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
27480 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
27490 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
274a0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
274b0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
274c0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
274d0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
274e0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
274f0 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
27500 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
27510 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
27520 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
27530 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
27540 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
27550 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
27560 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
27570 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
27580 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27590 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
275a0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
275b0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
275c0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
275d0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
275e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
275f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27600 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27610 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
27620 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
27630 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
27640 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
27650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
27660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
27680 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
27690 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
276a0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
276b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
276c0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
276d0 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
276e0 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
276f0 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d  ce to a memory m
27700 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63  apped page objec
27710 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  t for page numbe
27720 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20  r pgno. .** The 
27730 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
27740 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  use the pointer 
27750 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20  pData, obtained 
27760 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a  from xFetch()..*
27770 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27780 20 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20   set *ppPage to 
27790 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
277a0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a   page reference.
277b0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ** and return SQ
277c0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
277d0 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  se, return an SQ
277e0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
277f0 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61  and set.** *ppPa
27800 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  ge to zero..**.*
27810 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  * Page reference
27820 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  s obtained by ca
27830 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
27840 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65  ion should be re
27850 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c  leased.** by cal
27860 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73  ling pagerReleas
27870 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
27880 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
27890 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20  cquireMapPage(. 
278a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
278b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278c0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
278d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
27900 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mber */.  void *
27910 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
27920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
27930 74 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72  tch()'d data for
27940 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
27950 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20  PgHdr **ppPage  
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64  /* OUT: Acquired
27980 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   page object */.
27990 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279b0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
279c0 61 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65  apped page to re
279d0 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28  turn */.  .  if(
279e0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
279f0 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70  eelist ){.    *p
27a00 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67  pPage = p = pPag
27a10 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27a20 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
27a30 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
27a40 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
27a50 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
27a60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27a70 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20  >nExtra>=8 );.  
27a80 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74    memset(p->pExt
27a90 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c  ra, 0, 8);.  }el
27aa0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
27ab0 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73  = p = (PgHdr *)s
27ac0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
27ad0 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b  (sizeof(PgHdr) +
27ae0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
27af0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
27b00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
27b10 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
27b20 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
27b30 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
27b40 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
27b50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27b60 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
27b70 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74     }.    p->pExt
27b80 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  ra = (void *)&p[
27b90 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  1];.    p->flags
27ba0 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20   = PGHDR_MMAP;. 
27bb0 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
27bc0 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20      p->pPager = 
27bd0 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61  pPager;.  }..  a
27be0 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61  ssert( p->pExtra
27bf0 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20  ==(void *)&p[1] 
27c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27c10 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  pPage==0 );.  as
27c20 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d  sert( p->flags==
27c30 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20  PGHDR_MMAP );.  
27c40 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
27c50 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
27c60 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
27c70 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20  1 );..  p->pgno 
27c80 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61  = pgno;.  p->pDa
27c90 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50  ta = pData;.  pP
27ca0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b  ager->nMmapOut++
27cb0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
27cc0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
27cd0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
27ce0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
27cf0 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74  ge pPg. pPg must
27d00 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72   have been retur
27d10 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61  ned by an .** ea
27d20 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61  rlier call to pa
27d30 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
27d40 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
27d50 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65  oid pagerRelease
27d60 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70  MapPage(PgHdr *p
27d70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
27d80 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
27d90 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  er;.  pPager->nM
27da0 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d  mapOut--;.  pPg-
27db0 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
27dc0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27dd0 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  .  pPager->pMmap
27de0 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a  Freelist = pPg;.
27df0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27e00 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  r->fd->pMethods-
27e10 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a  >iVersion>=3 );.
27e20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
27e30 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
27e40 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
27e50 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
27e60 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  ze, pPg->pData);
27e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27e80 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ll PgHdr objects
27e90 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
27ea0 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69  ager.pMmapFreeli
27eb0 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  st list..*/.stat
27ec0 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65  ic void pagerFre
27ed0 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a  eMapHdrs(Pager *
27ee0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
27ef0 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e   *p;.  PgHdr *pN
27f00 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  ext;.  for(p=pPa
27f10 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27f20 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  st; p; p=pNext){
27f30 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
27f40 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69  pDirty;.    sqli
27f50 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
27f60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  .}.../*.** Shutd
27f70 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
27f80 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
27f90 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
27fa0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
27fb0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
27fc0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
27fd0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
27fe0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
27ff0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
28000 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
28010 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
28020 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
28030 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
28040 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
28050 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
28060 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
28070 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
28080 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
28090 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
280a0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
280b0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
280c0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
280d0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
280e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
280f0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
28100 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
28110 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
28120 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
28130 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
28140 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28150 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
28160 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
28170 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
28180 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
28190 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
281a0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
281b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
281c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
281d0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
281e0 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a  Pager, sqlite3 *
281f0 64 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  db){.  u8 *pTmp 
28200 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
28210 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
28220 73 65 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65  sert( db || page
28230 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
28240 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28250 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28260 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28270 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
28280 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
28290 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
282a0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
282b0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
282c0 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
282d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
282e0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
282f0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
28300 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
28310 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73  E_OMIT_WAL.  ass
28320 65 72 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65  ert( db || pPage
28330 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20  r->pWal==0 );.  
28340 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
28350 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62  pPager->pWal, db
28360 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  , pPager->ckptSy
28370 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d  ncFlags, pPager-
28380 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
28390 20 28 64 62 20 26 26 20 28 64 62 2d 3e 66 6c 61   (db && (db->fla
283a0 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b  gs & SQLITE_NoCk
283b0 70 74 4f 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a  ptOnClose) ? 0 :
283c0 20 70 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50   pTmp).  );.  pP
283d0 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
283e0 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
283f0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28400 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
28410 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
28420 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
28430 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
28440 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
28450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
28460 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
28470 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
28480 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
28490 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
284a0 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
284b0 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
284c0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
284d0 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
284e0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
284f0 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
28500 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
28510 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
28520 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
28530 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
28540 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
28550 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
28560 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
28570 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28580 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
28590 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
285a0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
285b0 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
285c0 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
285d0 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
285e0 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
285f0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
28600 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
28610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
28620 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
28630 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
28640 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
28650 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
28660 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
28670 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
28680 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
28690 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
286a0 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
286b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
286c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
286d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
286e0 64 29 20 29 7b 0a 23 69 66 20 30 0a 20 20 20 20  d) ){.#if 0.    
286f0 20 20 69 66 28 20 70 61 67 65 72 49 73 53 65 72    if( pagerIsSer
28700 76 65 72 28 70 50 61 67 65 72 29 20 29 7b 0a 20  ver(pPager) ){. 
28710 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
28730 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
28740 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 29 3b  LMODE_PERSIST );
28750 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
28760 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
28770 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28780 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  _DELETE;.       
28790 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79   /* If necessary
287a0 2c 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  , change the pag
287b0 65 72 20 73 74 61 74 65 20 73 6f 20 74 68 61 74  er state so that
287c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
287d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  e .        ** is
287e0 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
287f0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 55 6e 6c  call to pagerUnl
28800 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29  ockAndRollback()
28810 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
28820 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28830 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
28840 45 4e 20 29 20 70 50 61 67 65 72 2d 3e 65 53 74  EN ) pPager->eSt
28850 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
28860 45 52 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ER;.      }.#end
28870 69 66 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  if.      pager_e
28880 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67  rror(pPager, pag
28890 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
288a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
288b0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
288c0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
288d0 65 72 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  er);.  }.#ifdef 
288e0 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44  SQLITE_SERVER_ED
288f0 49 54 49 4f 4e 0a 20 20 69 66 28 20 70 61 67 65  ITION.  if( page
28900 72 49 73 53 65 72 76 65 72 28 70 50 61 67 65 72  rIsServer(pPager
28910 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
28920 53 65 72 76 65 72 44 69 73 63 6f 6e 6e 65 63 74  ServerDisconnect
28930 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72  (pPager->pServer
28940 2c 20 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  , pPager->fd);. 
28950 20 20 20 70 50 61 67 65 72 2d 3e 70 53 65 72 76     pPager->pServ
28960 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
28970 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
28980 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
28990 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
289a0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
289b0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
289c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
289d0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
289e0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
289f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28a00 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
28a10 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
28a20 20 70 50 61 67 65 72 29 29 3b 0a 20 20 73 71 6c   pPager));.  sql
28a30 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
28a40 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
28a50 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
28a60 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
28a70 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
28a80 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
28a90 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28aa0 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
28ab0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
28ac0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
28ad0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
28ae0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
28af0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
28b00 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
28b10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
28b20 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
28b30 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
28b40 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
28b50 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
28b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28b70 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
28b80 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
28b90 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
28ba0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28bb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
28bc0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
28bd0 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
28be0 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
28bf0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
28c00 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
28c10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
28c20 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
28c30 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
28c40 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
28c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
28c60 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
28c70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
28c80 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
28c90 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
28ca0 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
28cb0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
28cc0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
28cd0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
28ce0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
28cf0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
28d00 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
28d10 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
28d20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
28d30 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
28d40 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
28d50 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
28d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
28d70 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
28d80 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
28d90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
28da0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
28db0 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
28dc0 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
28dd0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
28de0 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
28df0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
28e00 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66  ristics of the f
28e10 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
28e20 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
28e30 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
28e40 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
28e50 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
28e60 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
28e70 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
28e80 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
28e90 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
28ea0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
28eb0 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
28ec0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
28ed0 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
28ee0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
28ef0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
28f00 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
28f10 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
28f20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
28f30 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
28f40 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
28f50 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
28f60 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
28f70 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
28f80 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
28f90 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
28fa0 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
28fb0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
28fc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
28fd0 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
28fe0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
28ff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
29000 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
29010 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
29020 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
29030 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
29040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
29050 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
29060 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
29070 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
29080 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
29090 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
290a0 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
290b0 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
290c0 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
290d0 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
290e0 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
290f0 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
29100 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
29110 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
29120 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
29130 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
29140 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
29150 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
29160 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
29170 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
29180 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
29190 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
291a0 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
291b0 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
291c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
291d0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
291e0 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
291f0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
29200 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
29210 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
29220 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
29230 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
29240 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
29250 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
29260 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29290 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
292a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
292b0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
292c0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
292d0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
292e0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
292f0 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
29300 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
29310 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
29320 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
29330 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
29340 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
29350 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
29360 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
29370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29380 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
29390 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
293a0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
293b0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
293c0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
293d0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
293e0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
293f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
29400 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
29410 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
29420 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
29430 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
29440 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
29450 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
29460 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
29470 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
29480 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
29490 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
294a0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
294b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
294c0 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
294d0 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
294e0 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
294f0 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
29500 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
29510 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
29520 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
29530 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
29540 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
29550 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
29560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
29570 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
29580 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
29590 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
295a0 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
295b0 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
295c0 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
295d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
295e0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
295f0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
29600 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
29610 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
29620 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
29630 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
29640 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
29650 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
29660 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
29670 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
29680 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
29690 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
296a0 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
296b0 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
296c0 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
296d0 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
296e0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
296f0 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
29700 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
29710 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
29720 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
29730 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
29740 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
29750 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
29760 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
29770 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
29780 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
29790 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
297a0 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
297b0 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
297c0 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
297d0 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
297e0 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
297f0 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
29800 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
29810 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
29820 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
29830 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
29840 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
29850 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
29860 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
29870 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
29880 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
29890 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
298a0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
298b0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
298c0 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
298d0 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
298e0 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
298f0 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
29900 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
29910 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29920 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
29930 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
29940 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
29950 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
29960 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
29970 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
29980 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
29990 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
299a0 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
299b0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
299c0 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
299d0 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
299e0 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
299f0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
29a00 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
29a10 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
29a20 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
29a30 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
29a40 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
29a50 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
29a60 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
29a70 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
29a80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
29a90 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
29aa0 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
29ab0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
29ac0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
29ad0 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
29ae0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29af0 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
29b00 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
29b10 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
29b20 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
29b30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
29b40 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
29b50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
29b60 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
29b70 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
29b80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29b90 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
29ba0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
29bb0 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
29bc0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
29bd0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
29be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29c00 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
29c10 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
29c20 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
29c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29c40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29c50 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
29c60 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
29c70 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
29c80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29c90 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
29ca0 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
29cb0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
29cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
29cd0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
29ce0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
29cf0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
29d00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
29d10 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
29d20 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
29d30 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
29d40 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
29d50 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
29d60 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
29d70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
29d80 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
29d90 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
29da0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29db0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
29dc0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
29dd0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
29de0 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
29df0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
29e00 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
29e10 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
29e20 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
29e30 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
29e40 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
29e50 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
29e60 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
29e70 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
29e80 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
29e90 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
29ea0 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
29eb0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
29ec0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
29ed0 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
29ee0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
29ef0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
29f00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
29f10 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
29f20 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
29f30 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
29f40 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
29f50 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
29f60 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
29f70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
29f80 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
29f90 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
29fa0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
29fb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29fc0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29fd0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
29fe0 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
29ff0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a000 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2a010 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2a020 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
2a030 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
2a040 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2a050 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
2a060 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a070 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
2a080 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
2a090 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
2a0a0 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
2a0b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2a0c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2a0d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a0e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2a0f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2a100 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
2a110 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
2a120 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
2a130 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
2a140 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
2a150 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2a160 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
2a170 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
2a180 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
2a190 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a1a0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2a1b0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2a1c0 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
2a1d0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
2a1e0 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
2a1f0 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
2a200 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
2a210 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
2a220 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a230 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2a240 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2a250 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2a260 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
2a270 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
2a280 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
2a290 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
2a2a0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
2a2b0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
2a2c0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
2a2d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
2a2e0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
2a2f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
2a300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a310 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a320 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2a330 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2a340 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
2a350 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2a360 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
2a370 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
2a380 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
2a390 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
2a3a0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
2a3b0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
2a3c0 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
2a3d0 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
2a3e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
2a3f0 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
2a400 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
2a410 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
2a420 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
2a430 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
2a440 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2a450 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
2a460 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
2a470 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
2a480 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
2a490 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a4a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
2a4b0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
2a4c0 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
2a4d0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
2a4e0 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
2a4f0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
2a500 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
2a510 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
2a520 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
2a530 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
2a540 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
2a550 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a560 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
2a570 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
2a580 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
2a590 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
2a5a0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
2a5b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
2a5c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
2a5d0 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
2a5e0 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
2a5f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
2a600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2a610 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
2a620 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
2a630 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
2a640 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
2a650 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
2a660 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
2a670 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
2a680 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
2a690 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
2a6a0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2a6b0 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
2a6c0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
2a6d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a6e0 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
2a6f0 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
2a700 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
2a710 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
2a720 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
2a730 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
2a740 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
2a750 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
2a760 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
2a770 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
2a780 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
2a790 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
2a7a0 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
2a7b0 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
2a7c0 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
2a7d0 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
2a7e0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2a7f0 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
2a800 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
2a810 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
2a820 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
2a830 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
2a840 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2a850 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2a860 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
2a870 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
2a880 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
2a890 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
2a8a0 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
2a8b0 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
2a8c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
2a8d0 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
2a8e0 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
2a8f0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
2a900 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
2a910 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
2a920 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
2a930 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
2a940 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
2a950 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
2a960 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
2a970 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
2a980 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
2a990 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
2a9a0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
2a9b0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2a9c0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2a9d0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2a9e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2a9f0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2aa00 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
2aa10 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2aa20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
2aa30 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
2aa40 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
2aa50 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
2aa60 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2aa70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2aa80 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
2aa90 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
2aaa0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
2aab0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
2aac0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2aae0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2aaf0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
2ab00 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
2ab10 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
2ab20 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
2ab30 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
2ab40 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2ab50 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2ab60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ab70 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70  r->tempFile || p
2ab80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2ab90 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
2aba0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2abb0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
2abc0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
2abd0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2abe0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2abf0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
2ac00 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
2ac10 54 45 5f 53 45 52 56 45 52 5f 45 44 49 54 49 4f  TE_SERVER_EDITIO
2ac20 4e 0a 20 20 69 66 28 20 70 61 67 65 72 49 73 50  N.  if( pagerIsP
2ac30 72 6f 63 65 73 73 53 65 72 76 65 72 28 70 50 61  rocessServer(pPa
2ac40 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
2ac50 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 50 72   sqlite3ServerPr
2ac60 65 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 2d 3e  eCommit(pPager->
2ac70 70 53 65 72 76 65 72 2c 20 70 50 61 67 65 72 2d  pServer, pPager-
2ac80 3e 70 53 65 72 76 65 72 50 61 67 65 29 3b 0a 20  >pServerPage);. 
2ac90 20 20 20 70 50 61 67 65 72 2d 3e 70 53 65 72 76     pPager->pServ
2aca0 65 72 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  erPage = 0;.    
2acb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2acc0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2acd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2ace0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
2acf0 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
2ad00 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2ad10 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
2ad20 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
2ad30 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
2ad40 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
2ad50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2ad60 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
2ad70 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
2ad80 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
2ad90 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
2ada0 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
2adb0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2adc0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
2add0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ade0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
2adf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2ae00 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2ae10 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2ae20 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2ae30 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
2ae40 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
2ae50 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
2ae60 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
2ae70 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
2ae80 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
2ae90 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
2aea0 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  /.  assert( rc!=
2aeb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
2aec0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2aed0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2aee0 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50  ITE_OK .   && pP
2aef0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2af00 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a  <pPager->dbSize.
2af10 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44     && (pList->pD
2af20 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  irty || pList->p
2af30 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69  gno>pPager->dbHi
2af40 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  ntSize).  ){.   
2af50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
2af60 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
2af70 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
2af80 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
2af90 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
2afa0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2afb0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
2afc0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2afd0 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69  SIZE_HINT, &szFi
2afe0 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  le);.    pPager-
2aff0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
2b000 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2b010 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  }..  while( rc==
2b020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69  SQLITE_OK && pLi
2b030 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  st ){.    Pgno p
2b040 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e  gno = pList->pgn
2b050 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  o;..    /* If th
2b060 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
2b070 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
2b080 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
2b090 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
2b0a0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
2b0b0 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
2b0c0 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
2b0d0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29  rTruncateImage()
2b0e0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
2b0f0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
2b100 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
2b110 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
2b120 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
2b130 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
2b140 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
2b150 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
2b160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
2b170 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f  , do not write o
2b180 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  ut any page that
2b190 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44   has the PGHDR_D
2b1a0 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20  ONT_WRITE flag. 
2b1b0 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62     ** set (set b
2b1c0 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  y sqlite3PagerDo
2b1d0 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20  ntWrite())..    
2b1e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  */.    if( pgno<
2b1f0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
2b200 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
2b210 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
2b220 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
2b230 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
2b240 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
2b250 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a  ->pageSize;   /*
2b260 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
2b270 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
2b280 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  pData;          
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2b2b0 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20   to write */    
2b2c0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2b2d0 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2b2e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2b2f0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
2b300 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
2b310 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
2b320 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
2b330 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f  ;..      /* Enco
2b340 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
2b350 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  */.      CODEC2(
2b360 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
2b370 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72  Data, pgno, 6, r
2b380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b390 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b  EM_BKPT, pData);
2b3a0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
2b3b0 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
2b3c0 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
2b3d0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2b3e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
2b3f0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
2b400 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
2b410 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
2b420 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
2b430 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
2b440 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
2b450 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
2b460 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
2b470 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
2b480 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
2b490 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
2b4a0 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
2b4b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b4c0 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
2b4d0 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
2b4e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2b4f0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
2b500 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b510 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
2b520 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
2b530 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
2b540 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
2b550 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
2b560 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
2b570 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
2b580 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2b590 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
2b5a0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2b5b0 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
2b5c0 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
2b5d0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
2b5e0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
2b5f0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
2b600 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
2b610 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
2b620 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
2b630 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
2b640 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
2b650 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
2b660 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2b670 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
2b680 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
2b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
2b6b0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
2b6c0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
2b6d0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2b6e0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
2b6f0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2b700 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
2b710 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2b720 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
2b730 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b740 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
2b750 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
2b760 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2b770 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2b780 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2b790 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2b7a0 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2b7b0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2b7c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2b7d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2b7e0 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2b7f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2b800 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2b810 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2b820 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2b830 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2b840 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b850 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2b860 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2b870 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2b880 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2b890 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2b8a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2b8b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2b8c0 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2b8d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b8e0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2b8f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2b900 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b910 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2b920 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2b930 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
2b940 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54  t flags =  SQLIT
2b950 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
2b960 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
2b970 52 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20  READWRITE .     
2b980 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
2b990 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
2b9a0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20  PEN_EXCLUSIVE . 
2b9b0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
2b9c0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2b9d0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53  ;.    int nStmtS
2b9e0 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
2b9f0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
2ba00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2ba10 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2ba20 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2ba30 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
2ba40 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
2ba50 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69  {.      nStmtSpi
2ba60 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  ll = -1;.    }. 
2ba70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ba80 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
2ba90 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67  r->pVfs, 0, pPag
2baa0 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c  er->sjfd, flags,
2bab0 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20   nStmtSpill);.  
2bac0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2bad0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
2bae0 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
2baf0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
2bb00 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
2bb10 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
2bb20 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2bb30 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
2bb40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2bb50 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
2bb60 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
2bb70 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
2bb80 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
2bb90 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
2bba0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2bbb0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
2bbc0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2bbd0 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
2bbe0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
2bbf0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
2bc00 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
2bc10 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
2bc20 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
2bc30 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
2bc40 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
2bc50 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
2bc60 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
2bc70 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
2bc80 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2bc90 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2bca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bcb0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
2bcc0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2bcd0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2bce0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2bcf0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2bd00 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
2bd10 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
2bd20 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
2bd30 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
2bd40 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
2bd50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2bd60 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
2bd70 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2bd80 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
2bd90 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bda0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2bdb0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2bdc0 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
2bdd0 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
2bde0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
2bdf0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
2be00 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
2be10 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  InJournal(pPager
2be20 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20  , pPg) .        
2be30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2be40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2be50 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20   .    );.    rc 
2be60 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2be70 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f  (pPager);..    /
2be80 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  * If the sub-jou
2be90 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20  rnal was opened 
2bea0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72  successfully (or
2beb0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   was already ope
2bec0 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65  n),.    ** write
2bed0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
2bee0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  ord into the fil
2bef0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
2bf00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bf10 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74        void *pDat
2bf20 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
2bf30 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
2bf40 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e   = (i64)pPager->
2bf50 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
2bf60 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
2bf70 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2bf80 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  ;..#if SQLITE_HA
2bf90 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20  S_CODEC   .     
2bfa0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75   if( !pPager->su
2bfb0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2bfc0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2bfd0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2bfe0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2bff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2c000 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  PT, pData2);.   
2c010 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
2c020 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 70        pData2 = p
2c030 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45  Data;.      PAGE
2c040 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
2c050 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2c060 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2c070 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2c080 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
2c090 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2c0a0 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
2c0b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2c0c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c0d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c0e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2c0f0 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
2c100 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
2c110 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
2c120 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
2c130 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
2c140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c150 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
2c160 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
2c170 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2c180 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
2c190 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
2c1a0 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
2c1b0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
2c1c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c1d0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2c1e0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2c1f0 72 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b  red(PgHdr *pPg){
2c200 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69  .  if( subjRequi
2c210 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2c220 20 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f      return subjo
2c230 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2c240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2c250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c260 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2c270 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c280 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2c290 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2c2a0 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2c2b0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2c2c0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2c2d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2c2e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2c2f0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2c300 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2c310 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2c320 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2c330 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2c340 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2c350 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2c360 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2c370 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2c380 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2c390 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2c3a0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2c3b0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2c3c0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2c3d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c3e0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2c3f0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2c400 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2c410 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2c420 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2c430 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2c440 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2c450 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2c460 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2c470 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2c480 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2c490 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2c4a0 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2c4b0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2c4c0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2c4d0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2c4e0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2c4f0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2c500 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2c510 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2c520 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2c530 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2c540 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2c550 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2c560 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2c570 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2c580 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2c590 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2c5a0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2c5b0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2c5c0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2c5d0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2c5e0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2c5f0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2c600 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2c610 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2c620 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2c630 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2c640 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2c650 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2c660 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c670 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 49 73  ;..  if( pagerIs
2c680 53 65 72 76 65 72 28 70 50 61 67 65 72 29 20 29  Server(pPager) )
2c690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c6a0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2c6b0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2c6c0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2c6d0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2c6e0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2c6f0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
2c700 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20  SYNC bit is set 
2c710 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
2c720 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
2c730 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
2c740 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
2c750 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
2c760 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
2c770 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
2c780 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
2c790 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
2c7a0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
2c7b0 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
2c7c0 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
2c7d0 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
2c7e0 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
2c7f0 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
2c800 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f  l ROLLBACK and O
2c810 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73  FF bits inhibits
2c820 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c   all cache spill
2c830 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c  ing.  ** regardl
2c840 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ess of whether o
2c850 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20  r not a sync is 
2c860 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20  required.  This 
2c870 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20  is set during.  
2c880 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ** a rollback or
2c890 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74   by user request
2c8a0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
2c8b0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
2c8c0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
2c8d0 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
2c8e0 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
2c8f0 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
2c900 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
2c910 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
2c920 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
2c930 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2c940 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f  it .  ** is impo
2c950 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74  ssible for sqlit
2c960 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
2c970 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  to be called wit
2c980 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a  h createFlag==3.
2c990 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68    ** while in th
2c9a0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68  e error state, h
2c9b0 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73  ence it is impos
2c9c0 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72  sible for this r
2c9d0 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62  outine to.  ** b
2c9e0 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  e called in the 
2c9f0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65  error state.  Ne
2ca00 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69  vertheless, we i
2ca10 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29  nclude a NEVER()
2ca20 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74  .  ** test for t
2ca30 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2ca40 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67  s a safeguard ag
2ca50 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61  ainst future cha
2ca60 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nges..  */.  if(
2ca70 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2ca80 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2ca90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65   SQLITE_OK;.  te
2caa0 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2cab0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2cac0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
2cad0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2cae0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2caf0 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  l & SPILLFLAG_OF
2cb00 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  F );.  testcase(
2cb10 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2cb20 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2cb30 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20  NOSYNC );.  if( 
2cb40 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2cb50 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67 65  ll.   && ((pPage
2cb60 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2cb70 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42  (SPILLFLAG_ROLLB
2cb80 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46  ACK|SPILLFLAG_OF
2cb90 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20  F))!=0.      || 
2cba0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
2cbb0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
2cbc0 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  0).  ){.    retu
2cbd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cbe0 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2cbf0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2cc00 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2cc10 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
2cc20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2cc30 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2cc40 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2cc50 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2cc60 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50  ageIfRequired(pP
2cc70 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63 3d  g); .    if( rc=
2cc80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cc90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2cca0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2ccb0 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2ccc0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a  }.  }else{.    .
2ccd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2cce0 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
2ccf0 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28 20  C_WRITE.    if( 
2cd00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2cd10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2cd20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2cd30 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
2cd40 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
2cd50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2cd60 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2cd70 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
2cd80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20     }.#endif.  . 
2cd90 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2cda0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2cdb0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2cdc0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2cdd0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2cde0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2cdf0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2ce00 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2ce10 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2ce20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2ce30 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2ce40 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2ce50 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2ce60 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2ce70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ce80 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2ce90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cea0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2ceb0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2cec0 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2ced0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2cee0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2cef0 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2cf00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2cf10 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2cf20 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2cf30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cf40 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2cf50 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2cf60 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2cf70 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2cf80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2cf90 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2cfa0 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2cfb0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2cfc0 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2cfd0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2cfe0 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2cff0 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2d000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d010 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2d020 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2d030 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2d040 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Code;.  if( !MEM
2d050 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
2d060 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
2d070 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2d080 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2d090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
2d0a0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2d0b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2d0c0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2d0d0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2d0e0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e  .      PgHdr *pN
2d0f0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
2d100 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rty;.      if( p
2d110 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  List->nRef==0 ){
2d120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2d130 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a  gerStress((void*
2d140 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b  )pPager, pList);
2d150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2d160 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
2d170 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2d180 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2d190 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2d1a0 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2d1b0 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2d1c0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2d1d0 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2d1e0 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2d1f0 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2d200 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2d210 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2d220 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2d230 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2d240 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2d250 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2d260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2d270 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2d280 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2d290 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2d2a0 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2d2b0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2d2c0 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2d2d0 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2d2e0 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2d2f0 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2d300 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2d310 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2d320 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2d330 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2d340 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2d350 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2d360 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2d370 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2d380 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2d390 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2d3a0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2d3b0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2d3c0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2d3d0 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2d3e0 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2d3f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2d400 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2d410 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2d420 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2d430 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2d440 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2d450 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2d460 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2d470 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2d480 20 20 57 68 65 6e 20 61 20 6e 65 77 20 70 61 67    When a new pag
2d490 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
2d4a0 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 38 20 62  the.** first 8 b
2d4b0 79 74 65 73 20 6f 66 20 74 68 69 73 20 73 70 61  ytes of this spa
2d4c0 63 65 20 61 72 65 20 7a 65 72 6f 65 64 20 62 75  ce are zeroed bu
2d4d0 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
2d4e0 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
2d4f0 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74 72 61 20  ..** (The extra 
2d500 73 70 61 63 65 20 69 73 20 75 73 65 64 20 62 79  space is used by
2d510 20 62 74 72 65 65 20 61 73 20 74 68 65 20 4d 65   btree as the Me
2d520 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a  mPage object.).*
2d530 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2d540 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2d550 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2d560 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2d570 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2d580 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2d590 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2d5a0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2d5b0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2d5c0 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2d5d0 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2d5e0 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2d5f0 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2d600 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2d610 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2d620 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2d630 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2d640 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2d650 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2d660 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2d670 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2d680 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2d690 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2d6a0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2d6b0 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2d6c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2d6d0 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2d6e0 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2d6f0 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2d700 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2d710 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2d720 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2d730 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2d740 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2d750 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2d760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2d770 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2d780 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2d790 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2d7a0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2d7b0 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2d7c0 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2d7d0 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2d7e0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2d7f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2d800 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2d810 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2d820 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2d830 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2d840 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2d850 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2d860 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2d870 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2d880 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2d890 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2d8a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d8b0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2d8c0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2d8d0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2d8e0 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2d8f0 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2d900 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2d910 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2d920 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2d930 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2d940 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2d950 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2d960 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2d970 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2d980 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2d990 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2d9a0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2d9b0 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2d9c0 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2d9d0 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2d9e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2d9f0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2da00 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2da10 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2da20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2da30 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2da40 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2da50 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2da60 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2da70 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2da80 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2da90 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2daa0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2dab0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2dac0 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2dad0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2dae0 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2daf0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2db00 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2db10 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2db20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2db30 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2db40 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2db50 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2db60 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2db70 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2db80 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2db90 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2dba0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2dbb0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2dbc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2dbd0 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2dbe0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2dbf0 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2dc00 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2dc10 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2dc20 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2dc30 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2dc40 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2dc50 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2dc60 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2dc70 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2dc80 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2dc90 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2dca0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2dcb0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2dcc0 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2dcd0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2dce0 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2dcf0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2dd00 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2dd10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dd20 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2dd30 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2dd40 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2dd50 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2dd60 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2dd70 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2dd80 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2dd90 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2dda0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2ddb0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2ddc0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2ddd0 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c   */.  journalFil
2dde0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2ddf0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
2de00 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20  e(pVfs));..  /* 
2de10 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
2de20 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
2de30 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
2de40 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
2de50 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66  pPager = 0;..#if
2de60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2de70 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
2de80 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45  flags & PAGER_ME
2de90 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44  MORY ){.    memD
2dea0 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  b = 1;.    if( z
2deb0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2dec0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2ded0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2dee0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c  lite3DbStrDup(0,
2def0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2df00 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2df10 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51  ==0  ) return SQ
2df20 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2df30 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  .      nPathname
2df40 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2df50 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2df60 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d       zFilename =
2df70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
2df80 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  ndif..  /* Compu
2df90 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
2dfa0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
2dfb0 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
2dfc0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
2dfd0 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
2dfe0 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
2dff0 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
2e000 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
2e010 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
2e020 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
2e030 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
2e040 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
2e050 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2e060 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2e070 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e080 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  *z;.    nPathnam
2e090 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
2e0a0 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74  name+1;.    zPat
2e0b0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2e0c0 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50  bMallocRaw(0, nP
2e0d0 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
2e0e0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2e0f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e100 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2e110 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  PT;.    }.    zP
2e120 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2e130 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2e140 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2e150 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2e160 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2e170 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2e180 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2e190 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2e1a0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2e1b0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2e1c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e1d0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2e1e0 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2e1f0 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2e200 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2e210 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2e220 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2e230 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2e240 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2e250 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2e260 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2e270 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2e280 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2e290 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2e2a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2e2b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2e2c0 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2e2d0 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2e2e0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2e2f0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2e300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2e310 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2e320 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2e330 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2e340 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2e350 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2e360 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2e370 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2e380 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2e390 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2e3a0 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2e3b0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2e3c0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2e3d0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2e3e0 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2e3f0 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2e400 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2e410 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2e420 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2e430 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2e440 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2e450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e460 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2e470 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2e480 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2e490 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2e4a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2e4b0 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2e4c0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2e4d0 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2e4e0 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2e4f0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2e500 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2e510 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2e520 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2e530 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2e540 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2e550 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2e560 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2e570 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2e590 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2e5a0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2e5b0 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2e5d0 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2e5e0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2e5f0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2e600 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2e610 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2e620 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2e630 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2e640 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2e650 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2e660 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2e670 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2e680 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2e690 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2e6a0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2e6b0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2e6c0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2e6d0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2e6e0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2e6f0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2e700 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2e710 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2e720 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2e730 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2e740 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2e750 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2e760 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2e770 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2e780 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2e790 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2e7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2e7b0 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2e7c0 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2e7d0 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2e7e0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2e7f0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2e800 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2e810 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2e820 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2e830 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2e840 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2e850 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2e860 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2e870 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e890 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2e8a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e8b0 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2e8c0 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2e8d0 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2e8e0 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2e8f0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2e900 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2e910 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2e920 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2e930 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2e940 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2e950 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2e960 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2e970 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2e980 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  T;.  }.  pPager 
2e990 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2e9a0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2e9b0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2e9c0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2e9d0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2e9e0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2e9f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2ea00 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2ea10 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2ea20 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2ea30 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2ea40 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2ea50 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2ea60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2ea70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2ea80 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2ea90 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2eaa0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2eab0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2eac0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2ead0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2eae0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2eaf0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2eb00 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2eb10 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2eb20 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2eb30 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2eb40 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2eb50 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2eb60 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2eb70 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2eb80 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2eb90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2eba0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2ebb0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2ebc0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2ebd0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2ebe0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2ebf0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2ec00 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2ec10 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2ec20 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ec30 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2ec40 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2ec50 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2ec60 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2ec70 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2ec80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2ec90 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2eca0 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2ecb0 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2ecc0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2ecd0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2ece0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2ecf0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2ed00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ed10 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2ed20 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2ed30 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2ed40 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2ed50 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2ed60 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2ed70 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2ed80 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2ed90 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2eda0 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2edb0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2edc0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2edd0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2ede0 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2edf0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2ee00 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2ee10 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2ee20 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2ee30 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2ee40 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2ee50 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2ee60 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2ee70 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2ee80 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2ee90 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eeb0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2eec0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2eed0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2eee0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2eef0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2ef00 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2ef10 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2ef20 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2ef30 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2ef40 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2ef50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2ef60 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2ef70 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2ef80 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2ef90 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2efa0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2efb0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2efc0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2efd0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2efe0 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2eff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2f000 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2f010 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2f020 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2f030 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2f040 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2f050 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2f060 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2f070 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2f080 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2f090 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2f0a0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2f0b0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2f0c0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2f0d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2f0e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f0f0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2f100 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2f110 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2f120 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2f130 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2f140 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2f150 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2f160 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f170 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2f180 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2f190 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2f1a0 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2f1b0 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2f1c0 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2f1d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2f1e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2f1f0 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2f200 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f210 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2f220 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2f230 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2f240 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2f250 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f260 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2f270 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2f280 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2f290 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f2a0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2f2b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2f2c0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2f2d0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2f2e0 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2f2f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2f300 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2f310 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2f320 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2f330 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2f340 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2f350 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f360 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2f370 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2f380 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2f390 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2f3a0 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2f3b0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f3c0 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f3e0 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2f3f0 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2f400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2f410 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f420 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2f430 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2f440 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2f460 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2f470 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2f480 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2f490 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2f4a0 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2f4b0 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2f4c0 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2f4d0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2f4e0 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2f4f0 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2f500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2f510 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2f520 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2f530 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2f540 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2f550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f570 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2f580 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2f590 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2f5a0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2f5b0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2f5c0 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2f5d0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2f5e0 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2f5f0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2f600 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2f610 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2f620 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2f630 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2f640 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2f650 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2f660 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2f670 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2f680 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2f690 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2f6a0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2f6b0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2f6c0 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2f6d0 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2f6e0 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2f6f0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2f700 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2f710 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2f720 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2f730 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2f740 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2f750 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2f760 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2f770 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2f780 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2f790 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2f7a0 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2f7b0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2f7c0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2f7d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2f7e0 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2f7f0 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d  e in EXCLUSIVE m
2f800 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ode */.    pPage
2f810 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20  r->noLock = 1;  
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f830 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a   Do no locking *
2f840 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  /.    readOnly =
2f850 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2f860 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2f870 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2f880 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2f890 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2f8a0 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2f8b0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2f8c0 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2f8d0 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2f8e0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2f8f0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2f900 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2f910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f920 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f930 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2f940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f950 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2f960 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2f970 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2f980 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2f990 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2f9a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2f9b0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2f9c0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f9d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78  TE_OK ){.    nEx
2f9e0 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2f9f0 74 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74  tra);.    assert
2fa00 28 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e  ( nExtra>=8 && n
2fa10 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2fa20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
2fa30 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
2fa40 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
2fa50 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2fa70 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2fa80 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2fa90 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2faa0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2fab0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2fac0 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ed above, free t
2fad0 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74  he  Pager struct
2fae0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2faf0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2fb00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fb10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
2fb20 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2fb30 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  d);.    sqlite3P
2fb40 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
2fb50 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
2fb60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2fb70 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2fb80 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
2fb90 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2fba0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2fbb0 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2fbc0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2fbd0 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2fbe0 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2fbf0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2fc00 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2fc10 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2fc20 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2fc30 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2fc40 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2fc50 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fc60 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2fc70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fc80 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2fc90 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2fca0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2fcb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2fcc0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2fcd0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2fce0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2fcf0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2fd00 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2fd10 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2fd20 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2fd30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2fd40 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2fd50 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2fd60 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2fd70 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2fd80 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2fd90 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2fda0 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2fdb0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2fdc0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2fdd0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2fde0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2fdf0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2fe00 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2fe10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2fe20 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2fe30 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2fe40 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2fe50 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2fe60 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2fe70 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2fe80 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2fe90 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2fea0 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2feb0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2fec0 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2fed0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2fee0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
2fef0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2ff00 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
2ff10 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2ff20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2ff30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72  rt( pPager->extr
2ff40 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  aSync==0 );.    
2ff50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ff60 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2ff70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ff80 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2ff90 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2ffa0 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  t( pPager->ckptS
2ffb0 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2ffc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2ffd0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
2ffe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  ;.    pPager->ex
2fff0 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  traSync = 0;.   
30000 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
30010 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
30020 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
30030 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
30040 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
30050 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e  NORMAL | WAL_SYN
30060 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a  C_TRANSACTIONS;.
30070 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
30080 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
30090 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
300a0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
300b0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
300c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
300d0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
300e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
300f0 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
30100 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
30110 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
30120 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
30130 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
30140 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
30150 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
30160 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
30170 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
30180 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
30190 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
301a0 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
301b0 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
301c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
301d0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
301e0 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
301f0 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
30200 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30210 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
30220 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
30230 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
30240 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
30250 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
30260 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
30270 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Arg = 0; */.  pP
30280 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
30290 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74  = xReinit;.  set
302a0 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
302b0 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  ger);.  /* memse
302c0 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
302d0 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
302e0 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
302f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d   /* pPager->szMm
30300 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
30310 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f  ULT_MMAP_SIZE //
30320 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20   will be set by 
30330 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70  btree.c */..  *p
30340 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
30350 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30360 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69  _OK;.}.../* Veri
30370 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
30380 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
30390 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72 20  t be deleted or 
303a0 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d  renamed out from
303b0 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70 61  .** under the pa
303c0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ger.  Return SQL
303d0 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64 61  ITE_OK if the da
303e0 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20  tabase is still 
303f0 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a  were it ought.**
30400 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20   to be on disk. 
30410 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
30420 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   (SQLITE_READONL
30430 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d  Y_DBMOVED or som
30440 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  e other error.**
30450 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74   code from sqlit
30460 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69 66  e3OsAccess()) if
30470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
30480 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a  s gone missing..
30490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
304a0 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
304b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
304c0 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20    int bHasMoved 
304d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
304e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
304f0 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  mpFile ) return 
30500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
30510 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
30520 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
30530 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
30540 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
30550 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46  me && pPager->zF
30560 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  ilename[0] );.  
30570 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
30580 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
30590 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
305a0 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62  TL_HAS_MOVED, &b
305b0 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28  HasMoved);.  if(
305c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
305d0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OUND ){.    /* I
305e0 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20  f the HAS_MOVED 
305f0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20  file-control is 
30600 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61  unimplemented, a
30610 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
30620 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ile.    ** has n
30630 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20  ot been moved.  
30640 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73 74  That is the hist
30650 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20  orical behavior 
30660 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72  of SQLite: prior
30670 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   to.    ** versi
30680 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76  on 3.8.3, it nev
30690 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20  er checked */.  
306a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
306b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
306c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
306d0 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  HasMoved ){.    
306e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
306f0 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20  ONLY_DBMOVED;.  
30700 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
30710 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
30720 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30730 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
30740 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
30750 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
30760 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
30770 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
30780 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
30790 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
307a0 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
307b0 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
307c0 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
307d0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
307e0 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
307f0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
30800 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
30810 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
30820 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
30830 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
30840 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
30850 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
30860 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
30870 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
30880 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
30890 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
308a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
308b0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
308c0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
308d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
308e0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
308f0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
30900 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
30910 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
30920 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
30930 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
30940 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30950 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
30960 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
30970 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
30980 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30990 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
309a0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
309b0 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
309c0 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
309d0 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
309e0 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
309f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
30a00 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
30a10 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
30a20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
30a30 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
30a40 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
30a50 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
30a60 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
30a70 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
30a80 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
30a90 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
30aa0 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
30ab0 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
30ac0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
30ad0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
30ae0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
30af0 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
30b00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30b10 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
30b20 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
30b30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
30b40 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
30b50 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
30b60 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30b70 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
30b80 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
30b90 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
30ba0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
30bb0 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
30bc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30bd0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
30be0 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
30bf0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
30c00 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
30c10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
30c20 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
30c30 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
30c40 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
30c50 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
30c60 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
30c70 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
30c80 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
30c90 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
30ca0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
30cb0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
30cc0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
30cd0 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
30ce0 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
30cf0 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
30d00 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
30d10 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
30d20 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
30d30 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
30d40 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
30d50 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
30d60 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
30d70 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
30d80 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 2c  r, int *pExists,
30d90 20 69 6e 74 20 2a 70 65 53 65 72 76 65 72 29 7b   int *peServer){
30da0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
30db0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
30dc0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
30dd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30de0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
30df0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
30e00 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e20 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
30e30 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
30e40 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
30e50 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
30e60 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
30e70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30e80 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
30e90 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
30ea0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
30eb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30ec0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
30ed0 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
30ee0 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
30ef0 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
30f00 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
30f10 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
30f20 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
30f30 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
30f40 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
30f50 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
30f60 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30f70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
30f80 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
30f90 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30fa0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
30fb0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
30fc0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
30fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
30fe0 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
30ff0 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
31000 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31010 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
31020 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
31030 20 6c 6f 63 6b 20 2a 2f 0a 0a 23 69 66 64 65 66   lock */..#ifdef
31040 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45   SQLITE_SERVER_E
31050 44 49 54 49 4f 4e 0a 20 20 20 20 72 63 20 3d 20  DITION.    rc = 
31060 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
31070 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
31080 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
31090 52 56 45 52 5f 4d 4f 44 45 2c 20 70 65 53 65 72  RVER_MODE, peSer
310a0 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ver);.    if( rc
310b0 21 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  !=SQLITE_NOTFOUN
310c0 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  D ){.      if( r
310d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
310e0 2a 70 65 53 65 72 76 65 72 20 29 20 72 65 74 75  *peServer ) retu
310f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
31100 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65  dif..    /* Race
31110 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
31120 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
31130 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
31140 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
31150 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
31160 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
31170 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
31180 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
31190 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
311a0 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
311b0 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
311c0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
311d0 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
311e0 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
311f0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
31200 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
31210 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
31220 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
31230 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
31240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
31250 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
31260 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
31270 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
31280 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
31290 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
312a0 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
312b0 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
312c0 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
312d0 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
312e0 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
312f0 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
31300 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
31310 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
31320 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
31330 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
31340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31350 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
31360 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
31370 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
31380 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31390 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
313a0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
313b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
313c0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b  ->tempFile==0 );
313d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
313e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
313f0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
31400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
31420 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
31430 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20  e is zero pages 
31440 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65  in size, that me
31450 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
31460 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  (1) the.        
31470 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ** journal is a 
31480 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70  remnant from a p
31490 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69  rior database wi
314a0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
314b0 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   where.        *
314c0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
314d0 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20  ile but not the 
314e0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65  journal was dele
314f0 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20  ted, or (2) the 
31500 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20  initial.        
31510 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
31520 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20  hat populates a 
31530 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
31540 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
31550 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
31560 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
31570 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
31580 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
31590 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61  However, take ca
315a0 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  re.        ** no
315b0 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
315c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
315d0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
315e0 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20  en due to.      
315f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64    ** journal_mod
31600 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20  e=PERSIST..     
31610 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
31620 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a  ( nPage==0 && !j
31630 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
31640 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
31650 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
31660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31670 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
31680 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
31690 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
316a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
316b0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
316c0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
316d0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
316e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
316f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
31700 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31710 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31720 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
31730 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
31740 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
31750 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
31760 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
31770 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
31780 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
31790 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
317a0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
317b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
317c0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
317d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
317e0 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
317f0 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
31800 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
31810 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
31820 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
31830 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
31840 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
31850 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
31860 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
31870 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
31880 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
31890 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
318a0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
318b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
318c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
318d0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
318e0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
318f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
31900 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
31910 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
31920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31930 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
31940 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
31950 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
31960 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
31970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
31980 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31990 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
319a0 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
319b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
319c0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
319d0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
319e0 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
319f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
31a10 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
31a30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
31a40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31a50 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
31a60 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
31a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
31a80 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
31a90 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
31aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
31ab0 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
31ac0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
31ad0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
31ae0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
31af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31b00 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
31b10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
31b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
31b30 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
31b40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
31b50 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
31b60 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
31b70 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
31b80 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
31b90 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
31ba0 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
31bb0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
31bc0 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
31bd0 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
31be0 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
31bf0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
31c00 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
31c10 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
31c20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
31c30 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
31c40 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
31c50 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
31c60 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
31c70 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
31c80 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
31c90 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
31ca0 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
31cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31cc0 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
31cd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
31ce0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
31cf0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
31d00 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
31d10 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
31d20 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
31d30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31d40 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
31d50 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
31d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31d70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31d80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31d90 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
31da0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
31db0 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44  SQLITE_SERVER_ED
31dc0 49 54 49 4f 4e 0a 73 74 61 74 69 63 20 69 6e 74  ITION.static int
31dd0 20 70 61 67 65 72 53 65 72 76 65 72 43 6f 6e 6e   pagerServerConn
31de0 65 63 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ect(Pager *pPage
31df0 72 2c 20 69 6e 74 20 65 53 65 72 76 65 72 29 7b  r, int eServer){
31e00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31e10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
31e20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
31e30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
31e40 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  noLock = 1;.    
31e50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
31e60 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
31e70 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3b  NALMODE_PERSIST;
31e80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31e90 33 53 65 72 76 65 72 43 6f 6e 6e 65 63 74 28 70  3ServerConnect(p
31ea0 50 61 67 65 72 2c 20 65 53 65 72 76 65 72 2c 20  Pager, eServer, 
31eb0 26 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72  &pPager->pServer
31ec0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31ed0 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
31ee0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 4a  e3PagerRollbackJ
31ef0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
31f00 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 66 69  ager, sqlite3_fi
31f10 6c 65 20 2a 70 4a 66 64 29 7b 0a 20 20 69 6e 74  le *pJfd){.  int
31f20 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
31f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31f40 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
31f50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
31f60 61 76 65 64 5f 6a 66 64 20 3d 20 70 50 61 67 65  aved_jfd = pPage
31f70 72 2d 3e 6a 66 64 3b 0a 20 20 75 38 20 73 61 76  r->jfd;.  u8 sav
31f80 65 64 5f 65 53 74 61 74 65 20 3d 20 70 50 61 67  ed_eState = pPag
31f90 65 72 2d 3e 65 53 74 61 74 65 3b 0a 20 20 75 38  er->eState;.  u8
31fa0 20 73 61 76 65 64 5f 65 4c 6f 63 6b 20 3d 20 70   saved_eLock = p
31fb0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3b 0a 20 20  Pager->eLock;.  
31fc0 69 36 34 20 73 61 76 65 64 5f 6a 6f 75 72 6e 61  i64 saved_journa
31fd0 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
31fe0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 36 34  ournalOff;.  i64
31ff0 20 73 61 76 65 64 5f 6a 6f 75 72 6e 61 6c 48 64   saved_journalHd
32000 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
32010 6e 61 6c 48 64 72 3b 0a 0a 20 20 61 73 73 65 72  nalHdr;..  asser
32020 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
32030 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
32040 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
32050 54 20 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e  T );..  pPager->
32060 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
32070 45 5f 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  E_LOCK;.  pPager
32080 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
32090 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20  _WRITER_DBMOD;. 
320a0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 70   pPager->jfd = p
320b0 4a 66 64 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  Jfd;.  rc = page
320c0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
320d0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
320e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
320f0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
32100 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 0a  ck(pPager, 1);..
32110 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
32120 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
32130 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
32140 20 73 61 76 65 64 5f 6a 66 64 3b 0a 20 20 70 50   saved_jfd;.  pP
32150 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 73  ager->eState = s
32160 61 76 65 64 5f 65 53 74 61 74 65 3b 0a 20 20 70  aved_eState;.  p
32170 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 73  Pager->eLock = s
32180 61 76 65 64 5f 65 4c 6f 63 6b 3b 0a 20 20 70 50  aved_eLock;.  pP
32190 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
321a0 20 3d 20 73 61 76 65 64 5f 6a 6f 75 72 6e 61 6c   = saved_journal
321b0 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
321c0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 73 61 76 65  ournalHdr = save
321d0 64 5f 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20  d_journalHdr;.  
321e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 76 6f  return rc;.}..vo
321f0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
32200 65 72 76 65 72 4a 6f 75 72 6e 61 6c 28 0a 20 20  erverJournal(.  
32210 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
32220 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
32230 6a 66 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  jfd,.  const cha
32240 72 20 2a 7a 4a 6f 75 72 6e 61 6c 0a 29 7b 0a 20  r *zJournal.){. 
32250 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32260 6c 20 3d 20 28 63 68 61 72 2a 29 7a 4a 6f 75 72  l = (char*)zJour
32270 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  nal;.  pPager->j
32280 66 64 20 3d 20 6a 66 64 3b 0a 7d 0a 23 65 6e 64  fd = jfd;.}.#end
32290 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
322a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
322b0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
322c0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
322d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
322e0 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
322f0 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
32300 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69  3PagerGet() unti
32310 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
32320 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
32330 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
32340 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
32350 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
32360 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
32370 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
32380 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
32390 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
323a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
323b0 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
323c0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
323d0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
323e0 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
323f0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
32400 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
32410 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
32420 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
32430 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
32440 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
32450 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
32460 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
32470 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
32480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32490 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
324a0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
324b0 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
324c0 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
324d0 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
324e0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
324f0 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
32500 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
32510 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
32520 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
32530 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
32540 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
32550 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
32560 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
32570 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
32580 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
32590 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
325a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
325b0 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
325c0 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
325d0 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
325e0 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
325f0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
32600 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
32610 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
32620 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
32630 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
32640 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
32650 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
32660 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
32670 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
32680 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
32690 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
326a0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
326b0 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
326c0 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
326d0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
326e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
326f0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
32700 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
32710 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
32720 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
32730 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
32740 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
32750 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
32760 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
32770 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
32780 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
32790 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
327a0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
327b0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
327c0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
327d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
327e0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
327f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
32800 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
32810 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
32820 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62 52   *pPager, int bR
32830 65 61 64 6f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  eadonly){.  int 
32840 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
32850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32860 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
32870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
32880 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20  ERVER_EDITION.  
32890 69 6e 74 20 65 53 65 72 76 65 72 20 3d 20 30 3b  int eServer = 0;
328a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 68  .#endif..  /* Th
328b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
328c0 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
328d0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
328e0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
328f0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
32900 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
32910 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
32920 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
32930 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
32940 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
32950 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
32960 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
32970 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
32980 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
32990 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20  ve access mode. 
329a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
329b0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
329c0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
329d0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  che)==0 );.  ass
329e0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
329f0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
32a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
32a10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
32a20 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
32a30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32a40 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
32a50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
32a60 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
32a70 29 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  );..  if( !pager
32a80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
32a90 20 20 20 26 26 20 21 70 61 67 65 72 49 73 53 65     && !pagerIsSe
32aa0 72 76 65 72 28 70 50 61 67 65 72 29 20 0a 20 20  rver(pPager) .  
32ab0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
32ac0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32ad0 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
32ae0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
32af0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
32b00 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
32b10 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
32b20 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
32b30 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
32b40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
32b50 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
32b60 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
32b70 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
32b80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
32b90 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
32ba0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
32bb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
32bd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
32be0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
32bf0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
32c00 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
32c10 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32c20 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
32c30 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
32c40 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
32c50 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
32c60 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
32c70 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
32c80 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
32c90 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
32ca0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
32cb0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
32cc0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32cd0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
32ce0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
32cf0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
32d00 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
32d10 6e 61 6c 2c 20 26 65 53 65 72 76 65 72 29 3b 0a  nal, &eServer);.
32d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 48        assert( bH
32d30 6f 74 4a 6f 75 72 6e 61 6c 3d 3d 30 20 7c 7c 20  otJournal==0 || 
32d40 65 53 65 72 76 65 72 3d 3d 30 20 29 3b 0a 20 20  eServer==0 );.  
32d50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
32d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32d70 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48      }.    if( bH
32d90 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
32da0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72     if( pPager->r
32db0 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
32dc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
32dd0 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
32de0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
32df0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
32e00 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
32e10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
32e20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32e30 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
32e40 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
32e50 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
32e60 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
32e70 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
32e80 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
32e90 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
32ea0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
32eb0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
32ec0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
32ed0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
32ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
32ef0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
32f00 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
32f10 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
32f20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
32f30 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
32f40 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
32f50 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
32f60 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  ling the .      
32f70 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62  ** hot-journal b
32f80 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  ack..      ** . 
32f90 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
32fa0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
32fb0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
32fc0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
32fd0 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74   any.      ** ot
32fe0 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65  her process atte
32ff0 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73  mpting to access
33000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33010 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a  le will get to .
33020 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f        ** this po
33030 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
33040 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61  and fail to obta
33050 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
33060 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20  SIVE lock .     
33070 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
33080 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
33090 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65  **.      ** Unle
330a0 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
330b0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
330c0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
330d0 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20  the lock is.    
330e0 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20    ** downgraded 
330f0 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62  to SHARED_LOCK b
33100 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
33110 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20  ion returns..   
33120 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
33130 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
33140 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
33150 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
33160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33170 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
33180 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  iled;.      }. .
33190 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69        /* If it i
331a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
331b0 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  en and the file 
331c0 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
331d0 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20  open the .      
331e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  ** journal for r
331f0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
33200 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20 69  . Write access i
33210 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
33220 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  se .      ** in 
33230 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
33240 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
33250 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
33260 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20  e kept open .   
33270 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62     ** and possib
33280 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
33290 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
332a0 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d  on. Also, write-
332b0 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a  access .      **
332c0 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75   is usually requ
332d0 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ired to finalize
332e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   the journal in 
332f0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72  journal_mode=per
33300 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  sist .      ** m
33310 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f  ode (and also fo
33320 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74  r journal_mode=t
33330 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20  runcate on some 
33340 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20  systems)..      
33350 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
33360 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
33370 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
33380 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
33390 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20   some .      ** 
333a0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
333b0 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
333c0 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
333d0 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
333e0 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63    ** this connec
333f0 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68  tion obtained th
33400 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
33410 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a   above. Or, it .
33420 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
33430 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
33440 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
33450 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
33460 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
33470 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
33480 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
33490 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
334a0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
334b0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
334c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
334d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
334e0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
334f0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
33500 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78 69          int bExi
33510 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  sts;            
33520 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
33530 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
33540 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
33550 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
33560 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 56  (.            pV
33570 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
33580 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
33590 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78  ESS_EXISTS, &bEx
335a0 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69  ists);.        i
335b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
335c0 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20   && bExists ){. 
335d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
335e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
335f0 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
33600 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
33610 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
33620 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
33630 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
33640 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
33650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
33660 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
33670 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
33680 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
33690 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
336a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
336b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
336c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
336d0 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
336e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
336f0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
33700 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
33710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
33720 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
33730 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
33740 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
33750 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
33760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33780 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
33790 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
337a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
337b0 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
337c0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
337d0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
337e0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
337f0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
33800 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
33810 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
33820 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
33830 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
33840 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
33850 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
33860 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
33870 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
33880 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
33890 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
338a0 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
338b0 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
338c0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
338d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
338e0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
338f0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
33900 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
33910 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
33920 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
33930 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
33940 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
33950 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
33960 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33970 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
33980 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33990 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
339a0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
339b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
339c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
339d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
339e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
339f0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
33a00 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  r, !pPager->temp
33a10 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
33a20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
33a30 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
33a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33a50 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
33a60 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
33a70 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
33a80 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
33a90 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
33aa0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33ac0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
33ad0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
33ae0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
33af0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
33b00 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
33b10 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
33b20 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
33b30 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
33b40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
33b50 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
33b60 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
33b70 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
33b80 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
33b90 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
33ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
33bb0 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
33bc0 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
33bd0 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
33be0 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
33bf0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
33c00 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
33c10 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
33c20 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
33c30 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
33c40 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
33c50 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
33c60 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
33c70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
33c80 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
33c90 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
33ca0 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
33cb0 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
33cc0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
33cd0 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
33ce0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
33cf0 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
33d00 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
33d10 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
33d20 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
33d30 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
33d40 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
33d50 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
33d60 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
33d70 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
33d80 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
33d90 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
33da0 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
33db0 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
33dc0 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
33dd0 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
33de0 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
33df0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
33e00 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
33e10 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
33e20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
33e30 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
33e40 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
33e50 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
33e60 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
33e70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
33e80 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
33e90 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
33ea0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
33eb0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
33ec0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
33ed0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
33ee0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
33ef0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
33f00 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
33f10 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
33f20 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
33f30 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
33f40 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
33f50 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
33f60 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33f70 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
33f80 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
33f90 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
33fa0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
33fb0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
33fc0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
33fd0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
33fe0 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
33ff0 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
34000 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
34010 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
34020 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
34030 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
34040 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
34050 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
34060 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
34070 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
34080 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
34090 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
340a0 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
340b0 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
340c0 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
340d0 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
340e0 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
340f0 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
34100 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
34110 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
34120 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
34130 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
34140 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
34150 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
34160 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
34170 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
34180 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
34190 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
341a0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
341b0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
341c0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
341d0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
341e0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
341f0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
34200 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
34210 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
34220 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
34230 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
34240 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
34250 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
34260 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
34270 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
34280 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
34290 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
342a0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
342b0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
342c0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
342d0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
342e0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
342f0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
34300 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
34310 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
34320 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
34330 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
34340 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54  rs)];..      IOT
34350 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
34360 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
34370 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
34380 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  s)));.      rc =
34390 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
343a0 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
343b0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
343c0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
343d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
343e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
343f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34400 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
34410 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
34420 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
34430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34450 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
34460 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
34470 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
34480 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
34490 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
344a0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
344b0 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
344c0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
344d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
344e0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
344f0 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  r);..        /* 
34500 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61  Unmap the databa
34510 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70  se file. It is p
34520 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74  ossible that ext
34530 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a  ernal processes.
34540 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68          ** may h
34550 61 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68  ave truncated th
34560 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34570 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65  and then extende
34580 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20  d it back.      
34590 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67    ** to its orig
345a0 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20  inal size while 
345b0 74 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73  this process was
345c0 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c   not holding a l
345d0 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ock..        ** 
345e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
345f0 72 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50  re may exist a P
34600 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e  ager.pMap mappin
34610 67 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20  g that appears. 
34620 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
34630 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62  the right size b
34640 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  ut is not actual
34650 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20  ly valid. Avoid 
34660 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
34670 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75  possibility by u
34680 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20  nmapping the db 
34690 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
346a0 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
346b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
346c0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
346d0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
346e0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  0, 0);.        }
346f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
34700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
34710 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 20  RVER_EDITION.   
34720 20 69 66 28 20 65 53 65 72 76 65 72 20 29 7b 0a   if( eServer ){.
34730 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
34740 53 65 72 76 65 72 43 6f 6e 6e 65 63 74 28 70 50  ServerConnect(pP
34750 61 67 65 72 2c 20 65 53 65 72 76 65 72 29 3b 0a  ager, eServer);.
34760 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
34770 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
34780 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
34790 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
347a0 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
347b0 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
347c0 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
347d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
347e0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
347f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
34800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
34810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34820 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
34830 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
34840 72 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  r);.    }.#ifnde
34850 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
34860 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
34870 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
34880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34890 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  ;.#endif.  }..#i
348a0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56  fdef SQLITE_SERV
348b0 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66 28  ER_EDITION.  if(
348c0 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28 70   pagerIsServer(p
348d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
348e0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
348f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _OK );.    asser
34900 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
34910 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  efcount(pPager)=
34920 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
34930 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
34940 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
34950 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
34960 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  er);.    rc = sq
34970 6c 69 74 65 33 53 65 72 76 65 72 42 65 67 69 6e  lite3ServerBegin
34980 28 70 50 61 67 65 72 2d 3e 70 53 65 72 76 65 72  (pPager->pServer
34990 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20  , bReadonly);.  
349a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
349b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
349c0 3d 20 73 71 6c 69 74 65 33 53 65 72 76 65 72 4c  = sqlite3ServerL
349d0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 70 53 65 72  ock(pPager->pSer
349e0 76 65 72 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  ver, 1, 0, 0);. 
349f0 20 20 20 7d 0a 20 20 20 20 73 65 74 47 65 74 74     }.    setGett
34a00 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29  erMethod(pPager)
34a10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
34a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34a30 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
34a40 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
34a50 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
34a60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
34a70 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
34a80 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
34a90 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
34aa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
34ab0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  =0 && pPager->eS
34ac0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
34ad0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
34ae0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
34af0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
34b00 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
34b10 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
34b20 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
34b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34b40 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
34b50 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
34b60 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
34b70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34b80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
34b90 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
34ba0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
34bb0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
34bc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61  ;.    pPager->ha
34bd0 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
34be0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
34bf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
34c00 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
34c10 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
34c20 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
34c30 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
34c40 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
34c50 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
34c60 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
34c70 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
34c80 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
34c90 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
34ca0 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
34cb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
34cc0 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
34cd0 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
34ce0 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
34cf0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
34d00 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
34d10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
34d20 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
34d30 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
34d40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
34d50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
34d60 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
34d70 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
34d80 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
34d90 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
34da0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
34db0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
34dc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
34dd0 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68  page getter meth
34de0 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20  ods each try to 
34df0 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  acquire a refere
34e00 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65  nce to a.** page
34e10 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
34e20 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72  r pgno. If the r
34e30 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
34e40 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
34e50 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
34e60 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
34e70 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
34e80 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
34e90 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
34ea0 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65   different imple
34eb0 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
34ec0 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20  e getter method 
34ed0 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
34ee0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
34ef0 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  e of the pager..
34f00 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  **.**     getPag
34f10 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20  eNormal()       
34f20 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c    --  The normal
34f30 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67   getter.**     g
34f40 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20  etPageError()   
34f50 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
34f60 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
34f70 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
34f80 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  e.**     getPage
34f90 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20  Mmap()          
34fa0 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d   --  Used if mem
34fb0 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69  ory-mapped I/O i
34fc0 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20  s enabled.**.** 
34fd0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
34fe0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
34ff0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
35000 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
35010 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
35020 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
35030 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
35040 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
35050 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
35060 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
35070 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
35080 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
35090 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
350a0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
350b0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
350c0 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
350d0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
350e0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
350f0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
35100 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
35110 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
35120 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
35130 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
35140 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
35150 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
35160 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
35170 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
35180 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
35190 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
351a0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
351b0 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
351c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
351d0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
351e0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
351f0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
35200 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
35210 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
35220 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
35230 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
35240 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
35250 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
35260 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67   if .** the flag
35270 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
35280 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47  ains the PAGER_G
35290 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74  ET_NOCONTENT bit
352a0 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
352b0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
352c0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
352d0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
352e0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
352f0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
35300 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
35310 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
35320 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
35330 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
35340 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
35350 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
35360 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
35370 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
35380 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
35390 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
353a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
353b0 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
353c0 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
353d0 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
353e0 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
353f0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
35400 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
35410 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
35420 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
35430 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
35440 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
35450 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
35460 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
35470 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
35480 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
35490 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
354a0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
354b0 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
354c0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41  nal..**.** If PA
354d0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
354e0 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  T is true, then 
354f0 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
35500 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
35510 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
35520 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
35530 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
35540 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
35550 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
35560 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
35570 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
35580 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
35590 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
355a0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
355b0 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
355c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
355d0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
355e0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
355f0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
35600 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
35610 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
35620 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
35630 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
35640 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
35650 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
35660 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
35670 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
35680 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
35690 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
356a0 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
356b0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
356c0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
356d0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
356e0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
356f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
35700 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
35710 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
35720 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
35730 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
35740 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
35750 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
35760 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
35770 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
35780 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
35790 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
357a0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
357b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
357c0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
357d0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
357e0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
357f0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
35800 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
35810 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
35820 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
35830 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
35840 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
35850 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
35860 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
35870 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
35880 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
35890 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
358a0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
358b0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
358c0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
358d0 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
358e0 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
358f0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
35900 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
35910 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67  ageNormal(.  Pag
35920 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
35930 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
35940 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
35950 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
35960 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
35970 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
35980 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
35990 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
359a0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
359b0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
359c0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
359d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
359e0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
359f0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
35a00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35a10 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
35a20 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20    u8 noContent; 
35a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47    /* True if PAG
35a50 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
35a60 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c   is set */.  sql
35a70 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
35a80 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65   *pBase;..  asse
35a90 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
35aa0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
35ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35ac0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
35ad0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
35ae0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35af0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35b00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35b10 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
35b20 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
35b30 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
35b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
35b50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61  RUPT_BKPT;.  pBa
35b60 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
35b70 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
35b80 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
35b90 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d  );.  if( pBase==
35ba0 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  0 ){.    pPg = 0
35bb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
35bc0 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72  e3PcacheFetchStr
35bd0 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ess(pPager->pPCa
35be0 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73  che, pgno, &pBas
35bf0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
35c00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
35c10 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35c20 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73  rr;.    if( pBas
35c30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
35c40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
35c50 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
35c60 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35c70 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rr;.    }.  }.  
35c80 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
35c90 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
35ca0 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
35cb0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35cc0 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74  pBase);.  assert
35cd0 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29  ( pPg==(*ppPage)
35ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35cf0 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  g->pgno==pgno );
35d00 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
35d10 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
35d20 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  | pPg->pPager==0
35d30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74   );..  noContent
35d40 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
35d50 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
35d60 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  !=0;.  if( pPg->
35d70 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
35d80 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
35d90 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
35da0 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
35db0 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
35dc0 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
35dd0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
35de0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
35df0 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
35e00 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
35e10 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
35e20 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
35e30 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
35e40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
35e50 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
35e60 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
35e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
35e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
35e90 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
35ea0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
35eb0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
35ec0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
35ed0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
35ee0 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f  ed. But first so
35ef0 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a  me error checks:
35f00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
35f10 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  1) The maximum p
35f20 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
35f30 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65  31.    ** (2) Ne
35f40 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68  ver try to fetch
35f50 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
35f60 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
35f70 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
35f80 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
35f90 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
35fa0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
35fb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35fc0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
35fd0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35fe0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
35ff0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
36000 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  ager;..    asser
36010 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
36020 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42  r->fd) || !MEMDB
36030 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
36040 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
36050 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
36060 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
36070 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
36080 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
36090 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
360a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
360b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
360c0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
360d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
360e0 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
360f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
36100 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
36110 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
36120 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
36130 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
36140 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
36150 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
36160 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
36170 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
36180 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
36190 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
361a0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
361b0 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
361c0 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
361d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
361e0 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
361f0 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
36200 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
36210 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
36220 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
36230 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
36240 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
36250 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
36260 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
36270 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
36280 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
36290 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
362a0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
362b0 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
362c0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
362d0 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
362e0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
362f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
36300 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
36310 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
36320 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
36330 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
36340 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
36350 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
36360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
36370 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
36380 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
36390 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
363a0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
363b0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
363c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
363d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
363e0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
363f0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
36400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
36410 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
36420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36430 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
36440 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
36450 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
36460 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
36470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36480 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
36490 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
364a0 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
364b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
364c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
364d0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
364e0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
364f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
36500 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
36510 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
36520 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
36530 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72  MISS]++;.      r
36540 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
36550 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
36560 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36580 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
36590 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
365a0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
365b0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
365c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
365d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
365e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
365f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36600 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
36610 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
36620 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
36630 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
36640 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
36650 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  ger);.  *ppPage 
36660 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
36670 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
36680 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
36690 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
366a0 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f  er for when memo
366b0 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
366c0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
366d0 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
366e0 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ap(.  Pager *pPa
366f0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
36700 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
36710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36720 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
36730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
36740 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
36750 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
36760 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
36770 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
36780 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
36790 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
367a0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
367b0 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
367c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
367d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
367e0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
367f0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
36800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36810 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
36820 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
36830 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
36840 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
36850 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
36860 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
36870 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
36880 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
36890 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
368a0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
368b0 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
368c0 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
368d0 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
368e0 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
368f0 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
36900 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
36910 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
36920 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36930 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
36940 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
36950 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65  o>1.   && (pPage
36960 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36970 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
36980 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
36990 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
369a0 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43   assert( USEFETC
369b0 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66  H(pPager) );.#if
369c0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
369d0 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70  ODEC.  assert( p
369e0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
369f0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
36a00 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
36a10 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
36a20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
36a30 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
36a40 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
36a50 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
36a60 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
36a70 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
36a80 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
36a90 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
36aa0 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
36ab0 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
36ac0 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
36ad0 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
36ae0 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
36af0 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
36b00 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
36b10 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
36b20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
36b30 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
36b40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36b50 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
36b60 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
36b70 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
36b80 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
36b90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36ba0 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
36bb0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
36bc0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
36bd0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
36be0 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
36bf0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
36c00 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
36c10 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
36c20 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
36c30 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
36c40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
36c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36c60 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
36c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
36c90 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
36ca0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69  me==0 ){.    voi
36cb0 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  d *pData = 0;.  
36cc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36cd0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
36ce0 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29  , .        (i64)
36cf0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
36d00 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
36d10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
36d20 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20  pData.    );.   
36d30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36d40 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
36d50 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36d60 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
36d70 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
36d80 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
36d90 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
36da0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
36db0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
36dc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
36dd0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
36de0 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
36df0 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
36e00 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
36e10 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b  Pg);.     }else{
36e20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36e30 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
36e40 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
36e50 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
36e60 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
36e70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36e80 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPg ){.        a
36e90 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
36ea0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
36eb0 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
36ec0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
36ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
36ee0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
36ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36f00 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36f10 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
36f20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
36f30 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f  return getPageNo
36f40 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e  rmal(pPager, pgn
36f50 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
36f60 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
36f70 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
36f80 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65  IZE>0 */../* The
36f90 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
36fa0 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65  hod for when the
36fb0 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72 72   pager is an err
36fc0 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74  or state */.stat
36fd0 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72  ic int getPageEr
36fe0 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ror(.  Pager *pP
36ff0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
37000 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
37010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37020 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
37030 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
37040 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
37050 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
37060 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
37070 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
37080 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
37090 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
370a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
370b0 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
370c0 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
370d0 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a  ARAMETER(pgno);.
370e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
370f0 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73  ER(flags);.  ass
37100 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
37110 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
37120 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
37130 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
37140 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a  r->errCode;.}...
37150 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20  /* Dispatch all 
37160 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75 65  page fetch reque
37170 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f  sts to the appro
37180 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d 65  priate getter me
37190 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  thod..*/.int sql
371a0 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
371b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
371c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
371d0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
371e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
371f0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
37200 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
37210 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
37220 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
37230 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
37240 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
37250 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
37260 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
37270 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
37280 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 23  XX flags */.){.#
37290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 52  ifdef SQLITE_SER
372a0 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20 69 66  VER_EDITION.  if
372b0 28 20 70 61 67 65 72 49 73 53 65 72 76 65 72 28  ( pagerIsServer(
372c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
372d0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  nt rc = sqlite3S
372e0 65 72 76 65 72 4c 6f 63 6b 28 70 50 61 67 65 72  erverLock(pPager
372f0 2d 3e 70 53 65 72 76 65 72 2c 20 70 67 6e 6f 2c  ->pServer, pgno,
37300 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
37310 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
37330 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
37340 50 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67  Pager->xGet(pPag
37350 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
37360 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
37370 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
37380 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
37390 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
373a0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
373b0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
373c0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
373d0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
373e0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
373f0 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
37400 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
37410 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
37420 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
37430 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
37440 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
37450 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
37460 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
37470 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
37480 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
37490 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
374a0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
374b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
374c0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
374d0 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
374e0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
374f0 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
37500 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
37510 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
37520 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
37530 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
37540 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
37550 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
37560 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
37570 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
37580 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
37590 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
375a0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
375b0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
375c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
375d0 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
375e0 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
375f0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
37600 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
37610 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
37620 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
37630 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
37640 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20  edLock );.  if( 
37650 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
37660 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
37670 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
37680 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
37690 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
376a0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
376b0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
376c0 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
376d0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
376e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
376f0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
37700 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
37710 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
37720 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
37730 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
37740 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
37750 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
37760 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
37770 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
37780 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37790 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
377a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
377b0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
377c0 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  l(DbPage *pPg){.
377d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
377e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d  .  assert( pPg!=
377f0 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  0 );.  pPager = 
37800 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
37810 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
37820 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
37830 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
37840 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
37850 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
37860 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
37870 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
37880 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
37890 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  ager);.}.void sq
378a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
378b0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
378c0 69 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65  if( pPg ) sqlite
378d0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
378e0 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll(pPg);.}../*.*
378f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37900 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
37910 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
37920 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
37930 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
37940 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
37950 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
37960 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37970 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
37980 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
37990 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
379a0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
379b0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
379c0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
379d0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
379e0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
379f0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
37a00 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
37a10 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
37a20 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
37a30 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
37a40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37a50 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
37a60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37a70 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
37a80 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
37a90 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
37aa0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
37ab0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
37ac0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
37ad0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
37ae0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
37af0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
37b00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
37b10 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
37b20 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
37b30 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
37b40 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
37b50 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
37b60 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
37b70 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
37b80 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
37b90 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
37ba0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
37bb0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
37bc0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
37bd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
37be0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
37bf0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
37c00 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
37c10 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
37c20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
37c30 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
37c40 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
37c50 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
37c60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
37c70 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
37c80 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
37c90 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
37ca0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
37cb0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
37cc0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
37cd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
37ce0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
37cf0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
37d00 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
37d10 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
37d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37d50 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
37d60 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
37d70 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
37d80 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
37d90 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
37da0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
37db0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37dc0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37dd0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
37de0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37df0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37e00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37e10 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37e20 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
37e30 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
37e40 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
37e50 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
37e60 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
37e70 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
37e80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
37e90 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
37ea0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
37eb0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
37ec0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
37ed0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
37ee0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
37ef0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37f00 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
37f10 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
37f20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37f30 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37f40 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
37f50 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37f60 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
37f70 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
37f80 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
37f90 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
37fa0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
37fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37fc0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
37fd0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
37fe0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37ff0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
38000 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
38010 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
38020 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
38030 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
38040 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
38050 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
38060 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
38070 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
38080 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
38090 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
380a0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
380b0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
380c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
380d0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
380e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ;.        int nS
380f0 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69  pill;..        i
38100 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
38110 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
38120 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
38130 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
38140 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
38150 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
38160 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
38170 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
38180 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
38190 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
381a0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
381b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
381c0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
381d0 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c     nSpill = jrnl
381e0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
381f0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
38200 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
38210 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
38220 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
38230 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
38240 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
38250 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
38260 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
38270 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
38280 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
38290 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
382a0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
382b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
382c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
382d0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
382e0 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20  en (.           
382f0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
38300 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
38310 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  r->jfd, flags, n
38320 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  Spill.          
38330 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
38340 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
38350 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
38360 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
38370 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
38380 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
38390 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
383a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
383b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
383c0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
383d0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
383e0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
383f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
38400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
38410 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
38420 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
38430 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
38440 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
38450 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
38460 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
38470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
38480 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
38490 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
384a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
384b0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
384c0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
384d0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
384e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
384f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38500 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
38510 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
38520 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
38530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
38540 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
38550 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
38560 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
38570 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38580 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
38590 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
385a0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
385b0 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
385c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
385d0 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
385e0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
385f0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
38600 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
38610 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
38620 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
38630 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
38640 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
38650 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
38660 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
38670 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
38680 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
38690 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
386a0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
386b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
386c0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
386d0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
386e0 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
386f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20