/ Hex Artifact Content
Login

Artifact cffcfe753445ef3a3d3830efd5f807fc171e7262:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 65 64 2c 20 61 6c 6c 20 74 68 61  occured, all tha
3090: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
30a0: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30b0: 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20  rnal to.**      
30c0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
30d0: 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  action. If an er
30e0: 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74  ror did occur, t
30f0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e  he caller will n
3100: 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72  eed.**      to r
3110: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
3120: 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  saction. .**.** 
3130: 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20   ERROR:.**.**   
3140: 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   The ERROR state
3150: 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e   is entered when
3160: 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66   an IO or disk-f
3170: 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75  ull error (inclu
3180: 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54  ding.**    SQLIT
3190: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f  E_IOERR_NOMEM) o
31a0: 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74  ccurs at a point
31b0: 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61   in the code tha
31c0: 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20  t makes it .**  
31d0: 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62    difficult to b
31e0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
31f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
3200: 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e  state (cache con
3210: 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62  tents, .**    db
3220: 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20   size etc.) are 
3230: 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20  consistent with 
3240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3250: 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
3260: 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72  .**.**    Tempor
3270: 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 20  ary pager files 
3280: 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45 52  may enter the ER
3290: 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 69  ROR state, but i
32a0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a  n-memory pagers.
32b0: 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a  **    cannot..**
32c0: 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70  .**    For examp
32d0: 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72  le, if an IO err
32e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
32f0: 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c  performing a rol
3300: 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68  lback, .**    th
3310: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3320: 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79  e page-cache may
3330: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
3340: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74  nconsistent stat
3350: 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73  e..**    At this
3360: 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20   point it would 
3370: 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20  be dangerous to 
3380: 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52  change back to R
3390: 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20  EADER state.**  
33a0: 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61    (as usually ha
33b0: 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f  ppens after a ro
33c0: 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62  llback). Any sub
33d0: 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73 20  sequent readers 
33e0: 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f  might.**    repo
33f0: 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  rt database corr
3400: 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74  uption (due to t
3410: 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  he inconsistent 
3420: 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a  cache), and if.*
3430: 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61 64  *    they upgrad
3440: 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68  e to writers, th
3450: 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65  ey may inadverte
3460: 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  ntly corrupt the
3470: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
3480: 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74  file. To avoid t
3490: 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20  his hazard, the 
34a0: 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20 69  pager switches i
34b0: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
34c0: 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61  ate.**    instea
34d0: 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c  d of READER foll
34e0: 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72  owing such an er
34f0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e  ror..**.**    On
3500: 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72 65  ce it has entere
3510: 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
3520: 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74  e, any attempt t
3530: 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72 0a  o use the pager.
3540: 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72  **    to read or
3550: 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74 75   write data retu
3560: 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76  rns an error. Ev
3570: 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61  entually, once a
3580: 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61  ll .**    outsta
3590: 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  nding transactio
35a0: 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62 61  ns have been aba
35b0: 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65  ndoned, the page
35c0: 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  r is able to.** 
35d0: 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61     transition ba
35e0: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
35f0: 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68 65  , discarding the
3600: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
3610: 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63   .**    page-cac
3620: 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  he and any other
3630: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65   in-memory state
3640: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
3650: 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a  e. Everything.**
3660: 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20      is reloaded 
3670: 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20  from disk (and, 
3680: 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f  if necessary, ho
3690: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
36a0: 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20  ck peformed).** 
36b0: 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74     when a read-t
36c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65  ransaction is ne
36d0: 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  xt opened on the
36e0: 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74 69   pager (transiti
36f0: 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20  oning.**    the 
3700: 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45  pager into READE
3710: 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68 61  R state). At tha
3720: 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74  t point the syst
3730: 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65 64  em has recovered
3740: 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65   .**    from the
3750: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   error..**.**   
3760: 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   Specifically, t
3770: 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69  he pager jumps i
3780: 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
3790: 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  ate if:.**.**   
37a0: 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f     1. An error o
37b0: 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74 65  ccurs while atte
37c0: 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  mpting a rollbac
37d0: 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  k. This happens 
37e0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75  in.**         fu
37f0: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3800: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a  gerRollback()..*
3810: 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20  *.**      2. An 
3820: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
3830: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
3840: 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72   finalize a jour
3850: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
3860: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20      following a 
3870: 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69  commit in functi
3880: 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  on sqlite3PagerC
3890: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e  ommitPhaseTwo().
38a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41  .**.**      3. A
38b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
38c0: 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20  hile attempting 
38d0: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
38e0: 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20  journal or.**   
38f0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
3900: 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ile in function 
3910: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e  pagerStress() in
3920: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
3930: 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d  p.**         mem
3940: 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e  ory..**.**    In
3950: 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74 68   other cases, th
3960: 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  e error is retur
3970: 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65  ned to the b-tre
3980: 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74  e layer. The b-t
3990: 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20  ree.**    layer 
39a0: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20  then attempts a 
39b0: 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
39c0: 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
39d0: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20   condition .**  
39e0: 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65 20    persists, the 
39f0: 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
3a00: 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69 61   ERROR state via
3a10: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61   condition (1) a
3a20: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43  bove..**.**    C
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20  ondition (3) is 
3a40: 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
3a50: 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69 67  e it can be trig
3a60: 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64 2d  gered by a read-
3a70: 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65  only.**    state
3a80: 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77 69  ment executed wi
3a90: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
3aa0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
3ab0: 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a  , if the error.*
3ac0: 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20 73  *    code were s
3ad0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74  imply returned t
3ae0: 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65 20  o the user, the 
3af0: 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75  b-tree layer wou
3b00: 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74  ld not.**    aut
3b10: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d  omatically attem
3b20: 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  pt a rollback, a
3b30: 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  s it assumes tha
3b40: 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a  t an error in a.
3b50: 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20  **    read-only 
3b60: 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74  statement cannot
3b70: 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65 72   leave the pager
3b80: 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c   in an internall
3b90: 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a  y inconsistent .
3ba0: 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a  **    state..**.
3bb0: 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67 65  **    * The Page
3bc0: 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
3bd0: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d  le is set to som
3be0: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
3bf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
3c00: 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f     * There are o
3c10: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74  ne or more outst
3c20: 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
3c30: 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74 65  s to pages (afte
3c40: 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61  r the.**      la
3c50: 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  st reference is 
3c60: 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67 65  dropped the page
3c70: 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61  r should move ba
3c80: 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
3c90: 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70  )..**    * The p
3ca0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69  ager is not an i
3cb0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
3cc0: 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  **    .**.** Not
3cd0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20  es:.**.**   * A 
3ce0: 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20 69  pager is never i
3cf0: 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f  n WRITER_DBMOD o
3d00: 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  r WRITER_FINISHE
3d10: 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a  D state if the.*
3d20: 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e  *     connection
3d30: 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20   is open in WAL 
3d40: 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e  mode. A WAL conn
3d50: 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  ection is always
3d60: 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f   in one.**     o
3d70: 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75 72  f the first four
3d80: 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20   states..**.**  
3d90: 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63   * Normally, a c
3da0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69  onnection open i
3db0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
3dc0: 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47   is never in PAG
3dd0: 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73  ER_OPEN.**     s
3de0: 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65 20  tate. There are 
3df0: 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20  two exceptions: 
3e00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3e10: 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  r exclusive-mode
3e20: 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e   has.**     been
3e30: 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20   turned on (and 
3e40: 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20  before any read 
3e50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
3e60: 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20  tions are .**   
3e70: 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64    executed), and
3e80: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
3e90: 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22  is leaving the "
3ea0: 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a  error state"..**
3eb0: 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f  .**   * See also
3ec0: 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  : assert_pager_s
3ed0: 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  tate()..*/.#defi
3ee0: 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20  ne PAGER_OPEN   
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3f00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
3f10: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
3f20: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50       1.#define P
3f30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
3f40: 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64 65  ED         2.#de
3f50: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3f60: 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20  R_CACHEMOD      
3f70: 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   3.#define PAGER
3f80: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
3f90: 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
3fa0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49   PAGER_WRITER_FI
3fb0: 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a 23  NISHED       5.#
3fc0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
3fd0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
3fe0: 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20     6../*.** The 
3ff0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
4000: 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61  able is almost a
4010: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65  lways set to one
4020: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
4030: 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74  owing locking-st
4040: 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20  ates, according 
4050: 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72  to the lock curr
4060: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a  ently held on.**
4070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4080: 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41  le: NO_LOCK, SHA
4090: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
40a0: 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55  ED_LOCK or EXCLU
40b0: 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68  SIVE_LOCK..** Th
40c0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b  is variable is k
40d0: 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20 61  ept up to date a
40e0: 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65  s locks are take
40f0: 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62  n and released b
4100: 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f  y.** the pagerLo
4110: 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65 72  ckDb() and pager
4120: 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70  UnlockDb() wrapp
4130: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
4140: 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72  e VFS xLock() or
4150: 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72   xUnlock() retur
4160: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65  ns an error othe
4170: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
4180: 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20  SY.** (i.e. one 
4190: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
41a0: 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20 69  ERR subtypes), i
41b0: 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77  t is not clear w
41c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
41d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77   the operation w
41e0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49  as successful. I
41f0: 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73 74  n these circumst
4200: 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44  ances pagerLockD
4210: 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72  b() and.** pager
4220: 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20  UnlockDb() take 
4230: 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61  a conservative a
4240: 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20  pproach - eLock 
4250: 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74 65  is always update
4260: 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  d.** when unlock
4270: 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e  ing the file, an
4280: 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77  d only updated w
4290: 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  hen locking the 
42a0: 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56  file if the.** V
42b0: 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65  FS call is succe
42c0: 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c  ssful. This way,
42d0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
42e0: 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65   variable may be
42f0: 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73   set.** to a les
4300: 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77  s exclusive (low
4310: 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74  er) value than t
4320: 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20  he lock that is 
4330: 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a  actually held.**
4340: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
4350: 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20  evel, but it is 
4360: 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d  never set to a m
4370: 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76 61  ore exclusive va
4380: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
4390: 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e  is usually safe.
43a0: 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66   If an xUnlock f
43b0: 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20  ails or appears 
43c0: 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d  to fail, there m
43d0: 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20  ay .** be a few 
43e0: 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28  redundant xLock(
43f0: 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63  ) calls or a loc
4400: 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f  k may be held fo
4410: 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a  r longer than.**
4420: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e   required, but n
4430: 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f  othing really go
4440: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4450: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
4460: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
4470: 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  se file is unloc
4480: 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65 72  ked as the pager
4490: 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45   moves.** from E
44a0: 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61  RROR to OPEN sta
44b0: 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  te. At this poin
44c0: 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  t there may be a
44d0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
44e0: 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c  e .** in the fil
44f0: 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65  e-system that ne
4500: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
4510: 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f   back (as part o
4520: 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44  f a OPEN->SHARED
4530: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20  .** transition, 
4540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  by the same page
4550: 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e  r or any other).
4560: 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   If the call to 
4570: 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69  xUnlock().** fai
4580: 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ls at this point
4590: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
45a0: 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61  s left holding a
45b0: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
45c0: 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f  , this.** can co
45d0: 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  nfuse the call t
45e0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
45f0: 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65  Lock() call made
4600: 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a   later as part.*
4610: 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  * of hot-journal
4620: 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a   detection..**.*
4630: 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
4640: 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65  Lock() is define
4650: 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74  d as returning t
4660: 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73  rue "if there is
4670: 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20   a RESERVED .** 
4680: 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69  lock held by thi
4690: 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79  s process or any
46a0: 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68   others". So xCh
46b0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
46c0: 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74  may .** return t
46d0: 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20  rue because the 
46e0: 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73  caller itself is
46f0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
4700: 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a  USIVE lock (but.
4710: 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20  ** doesn't know 
4720: 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  it because of a 
4730: 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69  previous error i
4740: 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74  n xUnlock). If t
4750: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61  his happens.** a
4760: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot-journal may
4770: 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72   be mistaken for
4780: 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67   a journal being
4790: 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61   created by an a
47a0: 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
47b0: 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  tion in another 
47c0: 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67  process, causing
47d0: 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20   SQLite to read 
47e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
47f0: 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c  e.** without rol
4800: 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  ling it back..**
4810: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
4820: 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61  nd this, if a ca
4830: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20  ll to xUnlock() 
4840: 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63  fails when unloc
4850: 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61  king the.** data
4860: 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f  base in the ERRO
4870: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
4880: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
4890: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a  NKNOWN_LOCK. It.
48a0: 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  ** is only chang
48b0: 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61  ed back to a rea
48c0: 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20  l locking state 
48d0: 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  after a successf
48e0: 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c  ul call.** to xL
48f0: 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20  ock(EXCLUSIVE). 
4900: 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74  Also, the code t
4910: 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53  o do the OPEN->S
4920: 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e  HARED state tran
4930: 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20  sition.** omits 
4940: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20  the check for a 
4950: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50  hot-journal if P
4960: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
4970: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4980: 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74  K .** lock. Inst
4990: 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20  ead, it assumes 
49a0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78  a hot-journal ex
49b0: 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73  ists and obtains
49c0: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   an EXCLUSIVE.**
49d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
49e0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
49f0: 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
4a00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65  roll it back. Se
4a10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61  e function.** Pa
4a20: 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
4a30: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e  for more detail.
4a40: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  .**.** Pager.eLo
4a50: 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73  ck may only be s
4a60: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4a70: 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  CK when the page
4a80: 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45  r is in .** PAGE
4a90: 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f  R_OPEN state..*/
4aa0: 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e  .#define UNKNOWN
4ab0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20  _LOCK           
4ac0: 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f       (EXCLUSIVE_
4ad0: 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41  LOCK+1)../*.** A
4ae0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
4af0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
4b00: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
4b10: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
4b20: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
4b30: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
4b40: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
4b50: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
4b60: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
4b70: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
4b80: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
4b90: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
4ba0: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
4bb0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
4bc0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
4bd0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
4be0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
4bf0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
4c00: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
4c10: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
4c20: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
4c30: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
4c40: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4c50: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
4c60: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
4c70: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
4c80: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
4c90: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
4ca0: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
4cb0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
4cc0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
4cd0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
4ce0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4cf0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
4d00: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
4d10: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
4d20: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
4d30: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
4d40: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
4d50: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
4d60: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
4d70: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
4d80: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
4d90: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
4da0: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
4db0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4dd0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4de0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4df0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e00: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e10: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e20: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e30: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e40: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e50: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e60: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4e80: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4e90: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ea0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4eb0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ec0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ed0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4ee0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4ef0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f10: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f20: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f30: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f40: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f50: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f60: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f70: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4f80: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4f90: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fa0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fb0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fc0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4fd0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
4fe0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
4ff0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5000: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5010: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5020: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5030: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5040: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5050: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5060: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5070: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5080: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50b0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50c0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50d0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
50e0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
50f0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5100: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5110: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5120: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5130: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5140: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5150: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5160: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5170: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
5180: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51b0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
51e0: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
51f0: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5200: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5210: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5220: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5230: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
5240: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
5250: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73  an instance of s
5260: 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64  truct Pager. A d
5270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
5280: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72   some of the mor
5290: 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62  e important memb
52a0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c  er variables fol
52b0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61  lows:.**.** eSta
52c0: 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63  te.**.**   The c
52d0: 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f  urrent 'state' o
52e0: 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
52f0: 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ct. See the comm
5300: 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a  ent and state.**
5310: 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65     diagram above
5320: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
5330: 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  on of the pager 
5340: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f  state..**.** eLo
5350: 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61  ck.**.**   For a
5360: 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61   real on-disk da
5370: 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72  tabase, the curr
5380: 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  ent lock held on
5390: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
53a0: 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  le -.**   NO_LOC
53b0: 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
53c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
53d0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
53e0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74  .**.**   For a t
53f0: 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
5400: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28  emory database (
5410: 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68  neither of which
5420: 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20   require any.** 
5430: 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76    locks), this v
5440: 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79  ariable is alway
5450: 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49  s set to EXCLUSI
5460: 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73  VE_LOCK. Since s
5470: 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73  uch.**   databas
5480: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50  es always have P
5490: 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f  ager.exclusiveMo
54a0: 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63  de==1, this tric
54b0: 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  ks the pager.** 
54c0: 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69    logic into thi
54d0: 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c  nking that it al
54e0: 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68  ready has all th
54f0: 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20  e locks it will 
5500: 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28  ever.**   need (
5510: 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f  and no reason to
5520: 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a   release them)..
5530: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20  **.**   In some 
5540: 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d  (obscure) circum
5550: 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61  stances, this va
5560: 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20  riable may also 
5570: 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55  be set to.**   U
5580: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
5590: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
55a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
55b0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
55c0: 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e  or.**   details.
55d0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
55e0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
55f0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
5600: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
5610: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
5620: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5630: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
5640: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
5650: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
5660: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
5670: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
5680: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
5690: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
56a0: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
56b0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
56c0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
56d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
56e0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
56f0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
5700: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
5710: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
5720: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
5730: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
5740: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
5750: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
5760: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
5770: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
5780: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
5790: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
57a0: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
57b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
57c0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
57d0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
57e0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
57f0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
5800: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
5810: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
5820: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5830: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
5840: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
5850: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
5860: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
5870: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
5880: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
5890: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
58a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
58b0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
58c0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
58d0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
58e0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
58f0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
5900: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61  ted..**.** setMa
5910: 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ster.**.**   Whe
5920: 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  n PagerCommitPha
5930: 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65  seOne() is calle
5940: 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72  d to commit a tr
5950: 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
5960: 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e  y.**   (or may n
5970: 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61  ot) specify a ma
5980: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
5990: 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
59a0: 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a  into the .**   j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
59c0: 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  re it is synced 
59d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20  to disk..**.**  
59e0: 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
59f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  a journal file c
5a00: 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72  ontains a master
5a10: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5a20: 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74   affects .**   t
5a30: 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20  he way in which 
5a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5a50: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66   is finalized af
5a60: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
5a70: 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d  ion is .**   com
5a80: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
5a90: 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69   back when runni
5aa0: 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ng in "journal_m
5ab0: 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64  ode=PERSIST" mod
5ac0: 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75  e..**   If a jou
5ad0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
5ae0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  ot contain a mas
5af0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b00: 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20  ter, it is.**   
5b10: 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65  finalized by ove
5b20: 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72  rwriting the fir
5b30: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
5b40: 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49  r with zeroes. I
5b50: 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63  f.**   it does c
5b60: 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d  ontain a master-
5b70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b90: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a   is finalized .*
5ba0: 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e  *   by truncatin
5bb0: 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  g it to zero byt
5bc0: 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74  es, just as if t
5bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65  he connection we
5be0: 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67  re .**   running
5bf0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5c00: 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65  e=truncate" mode
5c10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61  ..**.**   Journa
5c20: 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e  l files that con
5c30: 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72  tain master jour
5c40: 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e  nal pointers can
5c50: 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64  not be finalized
5c60: 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20  .**   simply by 
5c70: 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
5c80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
5c90: 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73  ader with zeroes
5ca0: 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61  , as the.**   ma
5cb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
5cc0: 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72  nter could inter
5cd0: 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f  fere with hot-jo
5ce0: 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
5cf0: 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65  f any.**   subse
5d00: 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70  quently interrup
5d10: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
5d20: 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20  that reuses the 
5d30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5d40: 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69  .**   The flag i
5d50: 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f  s cleared as soo
5d60: 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n as the journal
5d70: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5d80: 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20  ed (either.**   
5d90: 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  by PagerCommitPh
5da0: 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52  aseTwo or PagerR
5db0: 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20  ollback). If an 
5dc0: 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74  IO error prevent
5dd0: 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s the.**   journ
5de0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
5df0: 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ng successfully 
5e00: 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73  finalized, the s
5e10: 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a  etMaster flag.**
5e20: 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e     is cleared an
5e30: 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61  yway (and the pa
5e40: 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f  ger will move to
5e50: 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a   ERROR state)..*
5e60: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
5e70: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
5e80: 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74 77  **.**   These tw
5e90: 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  o boolean variab
5ea0: 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20  les control the 
5eb0: 62 65 68 61 76 69 6f 75 72 20 6f 66 20 63 61 63  behaviour of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70  */..  void *pMap
7c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c80: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70    /* Memory mapp
7c90: 65 64 20 70 72 65 66 69 78 20 6f 66 20 64 61 74  ed prefix of dat
7ca0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7cb0: 69 36 34 20 6e 4d 61 70 3b 20 20 20 20 20 20 20  i64 nMap;       
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7cd0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
7ce0: 74 20 70 4d 61 70 20 69 6e 20 62 79 74 65 73 20  t pMap in bytes 
7cf0: 2a 2f 20 0a 20 20 69 36 34 20 6e 4d 61 70 56 61  */ .  i64 nMapVa
7d00: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
7d10: 20 20 2f 2a 20 42 79 74 65 73 20 61 74 20 70 4d    /* Bytes at pM
7d20: 61 70 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  ap known to be v
7d30: 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  alid */.  i64 nM
7d40: 61 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  apLimit;        
7d50: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
7d60: 20 70 65 72 6d 69 74 74 65 64 20 6d 61 70 70 69   permitted mappi
7d70: 6e 67 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  ng size */.  int
7d80: 20 6e 4d 61 70 43 66 67 4c 69 6d 69 74 3b 20 20   nMapCfgLimit;  
7d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
7da0: 69 67 75 72 65 64 20 6c 69 6d 69 74 20 76 61 6c  igured limit val
7db0: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 6d 61  ue */.  int nMma
7dc0: 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  pOut;           
7dd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7de0: 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75 72 72   mmap pages curr
7df0: 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e  ently outstandin
7e00: 67 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  g */.  PgHdr *pF
7e10: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
7e20: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7e30: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7e40: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7e50: 0a 20 20 69 6e 74 20 62 4d 61 70 52 65 73 69 7a  .  int bMapResiz
7e60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
7e70: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 6d  * Check if the m
7e80: 61 70 70 69 6e 67 20 73 68 6f 75 6c 64 20 62 65  apping should be
7e90: 20 72 65 73 69 7a 65 64 20 2a 2f 0a 20 20 2f 2a   resized */.  /*
7ea0: 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  .  ** End of the
7eb0: 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67   routinely-chang
7ec0: 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ing class member
7ed0: 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.  ************
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
7f20: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
7f50: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
7f60: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
7f70: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7f90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
7fa0: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
7fb0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
7fc0: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fe0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
7ff0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
8000: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
8010: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
8020: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
8030: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
8040: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
8050: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
8060: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8070: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
8080: 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  page */.  Pgno m
8090: 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  xPgno;          
80a0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
80b0: 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66   allowed size of
80c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
80d0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
80e0: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
80f0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
8100: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
8110: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63  nal files */.  c
8120: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8140: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8150: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
8160: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
8170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
8180: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8190: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
81a0: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
81b0: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
81c0: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
81d0: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
81e0: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
81f0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
8200: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
8210: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  syHandler */.  i
8220: 6e 74 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20  nt aStat[3];    
8230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8240: 74 61 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20  tal cache hits, 
8250: 6d 69 73 73 65 73 20 61 6e 64 20 77 72 69 74 65  misses and write
8260: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
8270: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52  TE_TEST.  int nR
8280: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
8290: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
82a0: 65 20 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a  e pages read */.
82b0: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
82c0: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
82d0: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
82e0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
82f0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
8300: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8310: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
8320: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
8330: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
8340: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
8350: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
8360: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ta */.  void (*x
8370: 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
8380: 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f  oid*,int,int); /
8390: 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65  * Notify of page
83a0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f   size changes */
83b0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
83c0: 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20  Free)(void*);   
83d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
83e0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20  tructor for the 
83f0: 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20  codec */.  void 
8400: 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20  *pCodec;        
8410: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8420: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
8430: 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f  ec... methods */
8440: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
8450: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
8460: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
8470: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8480: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
8490: 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  se */.  PCache *
84a0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
84b0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
84c0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
84d0: 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ect */.#ifndef S
84e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
84f0: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8510: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
8520: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
8530: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20  _mode=wal" */.  
8540: 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20  char *zWal;     
8550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8560: 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69  ile name for wri
8570: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a  te-ahead log */.
8580: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8590: 20 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65   Indexes for use
85a0: 20 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61   with Pager.aSta
85b0: 74 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61  t[]. The Pager.a
85c0: 53 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Stat[] array con
85d0: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c  tains.** the val
85e0: 75 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20  ues accessed by 
85f0: 70 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44  passing SQLITE_D
8600: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49  BSTATUS_CACHE_HI
8610: 54 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a  T, CACHE_MISS .*
8620: 2a 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45  * or CACHE_WRITE
8630: 20 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73   to sqlite3_db_s
8640: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66  tatus()..*/.#def
8650: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48  ine PAGER_STAT_H
8660: 49 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50  IT   0.#define P
8670: 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20  AGER_STAT_MISS  
8680: 31 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  1.#define PAGER_
8690: 53 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a  STAT_WRITE 2../*
86a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
86b0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
86c0: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
86d0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
86e0: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
86f0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
8700: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
8710: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
8720: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
8730: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
8740: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
8750: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
8760: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
8770: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
8780: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
8790: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
87a0: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
87b0: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
87c0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
87d0: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
87e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
87f0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8800: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
8810: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
8820: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8830: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
8840: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
8850: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
8860: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
8870: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
8880: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
8890: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
88a0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
88b0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
88c0: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
88d0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
88e0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
88f0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
8900: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
8910: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
8920: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
8930: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
8940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
8950: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
8960: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
8970: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
8980: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
8990: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
89a0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
89b0: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
89c0: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
89d0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
89e0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
89f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
8a00: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
8a10: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
8a20: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
8a30: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
8a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
8a50: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
8a60: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
8a70: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
8a80: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
8a90: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
8aa0: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
8ab0: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
8ac0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
8ad0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
8ae0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
8af0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
8b00: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
8b10: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
8b20: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
8b30: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
8b40: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
8b50: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
8b60: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
8b70: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
8b80: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
8b90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
8ba0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
8bb0: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
8bc0: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
8bd0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
8be0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
8bf0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
8c00: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8c10: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
8c20: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
8c30: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
8c40: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
8c50: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
8c60: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
8c70: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
8c80: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
8c90: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
8ca0: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
8cb0: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
8cc0: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
8cd0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
8ce0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
8cf0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
8d00: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
8d10: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
8d20: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
8d30: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
8d40: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
8d50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
8d60: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
8d70: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
8d80: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
8d90: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
8da0: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
8db0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
8dc0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
8dd0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
8de0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
8df0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
8e00: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
8e10: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
8e20: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
8e30: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
8e40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
8e50: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
8e60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
8e70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
8e80: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
8e90: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
8ea0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
8eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
8ec0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
8ed0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
8ee0: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
8ef0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
8f00: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
8f10: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
8f20: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
8f30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
8f40: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
8f50: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
8f60: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
8f70: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
8f80: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
8f90: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
8fa0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8fb0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
8fc0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
8fd0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
8fe0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
8ff0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
9000: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
9010: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
9020: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
9030: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
9040: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
9050: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
9060: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
9070: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
9080: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
9090: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
90a0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
90b0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
90c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
90d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
90e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
90f0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
9100: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
9110: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
9120: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
9130: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63  ment to this mac
9140: 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73  ro is a file des
9150: 63 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71  criptor (type sq
9160: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a  lite3_file*)..**
9170: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9180: 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
9190: 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f  non-zero (but no
91a0: 74 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a  t 1) if it is..*
91b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20  *.** This is so 
91c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
91d0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
91e0: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  as:.**.**   if( 
91f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9200: 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  fd) ){ ....**.**
9210: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a   instead of.**.*
9220: 2a 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  *   if( pPager->
9230: 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  jfd->pMethods ){
9240: 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   ....*/.#define 
9250: 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46  isOpen(pFd) ((pF
9260: 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f  d)->pMethods)../
9270: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
9280: 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75   if this pager u
9290: 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61  ses a write-ahea
92a0: 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66  d log instead of
92b0: 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f   the usual.** ro
92c0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
92d0: 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  Otherwise false.
92e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
92f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74  TE_OMIT_WAL.stat
9300: 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65 57  ic int pagerUseW
9310: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
9320: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  ){.  return (pPa
9330: 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d  ger->pWal!=0);.}
9340: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9350: 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20 30  pagerUseWal(x) 0
9360: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52  .# define pagerR
9370: 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a  ollbackWal(x) 0.
9380: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57 61  # define pagerWa
9390: 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 29  lFrames(v,w,x,y)
93a0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
93b0: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
93c0: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
93d0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
93e0: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
93f0: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9400: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9410: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9420: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9430: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
9440: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
9450: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
9460: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
9470: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
9480: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
9490: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
94a0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
94b0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
94c0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
94d0: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
94e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
94f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9500: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9510: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9520: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9530: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
9540: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
9550: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
9560: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
9570: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9580: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
9590: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
95a0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
95b0: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
95c0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
95d0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
95e0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
95f0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9600: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9610: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9620: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9630: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
9640: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
9650: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
9660: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
9670: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
9680: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
9690: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
96a0: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
96b0: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
96c0: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
96d0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
96e0: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
96f0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9700: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9710: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9720: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9730: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
9740: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
9750: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
9760: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
9770: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
9780: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
9790: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
97a0: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
97d0: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
97e0: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
97f0: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9800: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9810: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9820: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9830: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9840: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
9850: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
9860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9870: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
9880: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9890: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
98a0: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
98b0: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
98c0: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
98d0: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
98e0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
98f0: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9900: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9910: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9920: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9930: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
9940: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
9950: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
9960: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
9970: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
9980: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
9990: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
99a0: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
99b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
99c0: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
99d0: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
99e0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
99f0: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9a00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9a10: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9a20: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9a30: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
9a40: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
9a50: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
9a60: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
9a70: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
9a80: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
9a90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9aa0: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9ab0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ac0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9ad0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9ae0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9af0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9b00: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9b10: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9b20: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9b30: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
9b40: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
9b50: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
9b60: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
9b70: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
9b80: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
9b90: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9ba0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9bb0: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9bc0: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9bd0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9be0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9bf0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9c10: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9c30: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
9c40: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
9c50: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
9c60: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
9c70: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
9c80: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
9c90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9ca0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9cb0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9cc0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9cd0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9ce0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9cf0: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9d00: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9d10: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9d20: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9d30: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9d40: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9d50: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9d60: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
9d70: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
9d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9d90: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9da0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65  OCK );.      bre
9db0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9dc0: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9dd0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9de0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9df0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9e00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9e10: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9e20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
9e30: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9e40: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
9e50: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9e60: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9e70: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
9e80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e90: 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72  ->dbSize==pPager
9ea0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
9eb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9ec0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9ed0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
9ee0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9ef0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9f00: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9f10: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
9f20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9f30: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
9f40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
9f50: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f60: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
9f70: 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  OD:.      assert
9f80: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9f90: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9fa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9fb0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9fc0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9fd0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9fe0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ff0: 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
a000: 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72  ble that if jour
a010: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72  nal_mode=wal her
a020: 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74  e that neither t
a030: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
a040: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74  urnal file nor t
a050: 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20  he WAL file are 
a060: 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65  open. This happe
a070: 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20  ns during.      
a080: 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
a090: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
a0a0: 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a   switches from j
a0b0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a  ournal_mode=off.
a0c0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f          ** to jo
a0d0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a  urnal_mode=wal..
a0e0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a0f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a100: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a110: 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  CK );.        as
a120: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a130: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a140: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a150: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a160: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a170: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a180: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a190: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a1a0: 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  AL .        );. 
a1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
a1c0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a1d0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a1e0: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20  >dbFileSize );. 
a1f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a200: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a210: 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53  =pPager->dbHintS
a220: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ize );.      bre
a230: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a240: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
a250: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a260: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a270: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a280: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a290: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a2a0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a2b0: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a2c0: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a2d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a2e0: 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f  Lock>=EXCLUSIVE_
a2f0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a300: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e  sert( isOpen(p->
a310: 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
a320: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a330: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a340: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
a350: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a360: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a370: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
a380: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
a390: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a3a0: 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65  bOrigSize<=pPage
a3b0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a3c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a3d0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a3e0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20  ITER_FINISHED:. 
a3f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a400: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
a410: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a420: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a430: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
a440: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a450: 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
a460: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
a470: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a480: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a490: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a4a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a4b0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a4c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a4d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a4e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a4f0: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a500: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a510: 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a  se PAGER_ERROR:.
a520: 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d        /* There m
a530: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
a540: 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
a550: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
a560: 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20   pager if.      
a570: 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74  ** in ERROR stat
a580: 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  e. Otherwise the
a590: 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61   pager should ha
a5a0: 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70  ve already dropp
a5b0: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  ed.      ** back
a5c0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a   to OPEN state..
a5d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a5e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
a5f0: 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
a600: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a610: 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
a620: 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
a630: 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 20  >pPCache)>0 );. 
a640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
a650: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
a660: 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
a670: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
a680: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 0a  f SQLITE_DEBUG .
a690: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a6a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d 61  ointer to a huma
a6b0: 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69 6e  n readable strin
a6c0: 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62 75  g in a static bu
a6d0: 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ffer.** containi
a6e0: 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ng the state of 
a6f0: 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
a700: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a710: 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a 20  gument. This.** 
a720: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
a730: 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64 65  e used within de
a740: 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78 61  buggers. For exa
a750: 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74 65  mple, as an alte
a760: 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22 70  rnative.** to "p
a770: 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69 6e  rint *pPager" in
a780: 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64 62   gdb:.**.** (gdb
a790: 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20 70  ) printf "%s", p
a7a0: 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65  rint_pager_state
a7b0: 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61 74  (pPager).*/.stat
a7c0: 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f 70  ic char *print_p
a7d0: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
a7e0: 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20 63   *p){.  static c
a7f0: 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b 0a  har zRet[1024];.
a800: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
a810: 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c 0a  ntf(1024, zRet,.
a820: 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65 3a        "Filename:
a830: 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20        %s\n".    
a840: 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20 20    "State:       
a850: 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64 5c    %s errCode=%d\
a860: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a 20  n".      "Lock: 
a870: 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a 20           %s\n". 
a880: 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f       "Locking mo
a890: 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  de:  locking_mod
a8a0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4a  e=%s\n".      "J
a8b0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f  ournal mode:  jo
a8c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22  urnal_mode=%s\n"
a8d0: 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67 20  .      "Backing 
a8e0: 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65 3d  store: tempFile=
a8f0: 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65 4a  %d memDb=%d useJ
a900: 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20 20  ournal=%d\n".   
a910: 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20 20     "Journal:    
a920: 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c     journalOff=%l
a930: 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25 6c  ld journalHdr=%l
a940: 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69 7a  ld\n".      "Siz
a950: 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73 69  e:          dbsi
a960: 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a 65  ze=%d dbOrigSize
a970: 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d 25  =%d dbFileSize=%
a980: 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  d\n".      , p->
a990: 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20  zFilename.      
a9a0: 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  , p->eState==PAG
a9b0: 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20 20  ER_OPEN         
a9c0: 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20 20     ? "OPEN" :.  
a9d0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a9e0: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20 20  =PAGER_READER   
a9f0: 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45 52         ? "READER
aa00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa10: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa20: 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20 22  TER_LOCKED   ? "
aa30: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20 3a  WRITER_LOCKED" :
aa40: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
aa50: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
aa60: 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52 49  _CACHEMOD ? "WRI
aa70: 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a 0a  TER_CACHEMOD" :.
aa80: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
aa90: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
aaa0: 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49 54  DBMOD    ? "WRIT
aab0: 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20 20  ER_DBMOD" :.    
aac0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
aad0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
aae0: 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f 46  SHED ? "WRITER_F
aaf0: 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20 20  INISHED" :.     
ab00: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
ab10: 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20 20  GER_ERROR       
ab20: 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a 20      ? "ERROR" : 
ab30: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ab40: 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f 64  , (int)p->errCod
ab50: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c 6f  e.      , p->eLo
ab60: 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  ck==NO_LOCK     
ab70: 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20      ? "NO_LOCK" 
ab80: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f  :.        p->eLo
ab90: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
aba0: 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44 22  K   ? "RESERVED"
abb0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
abc0: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
abd0: 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49 56  OCK  ? "EXCLUSIV
abe0: 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  E" :.        p->
abf0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
ac00: 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45 44  CK     ? "SHARED
ac10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac20: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
ac30: 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e  CK    ? "UNKNOWN
ac40: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
ac50: 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73 69      , p->exclusi
ac60: 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75 73  veMode ? "exclus
ac70: 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a  ive" : "normal".
ac80: 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e        , p->journ
ac90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
aca0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
acb0: 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a 0a     ? "memory" :.
acc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
acd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ace0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
acf0: 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20 20     ? "off" :.   
ad00: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
ad10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ad20: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
ad30: 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20 20  ? "delete" :.   
ad40: 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d       p->journalM
ad50: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ad60: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20  ALMODE_PERSIST  
ad70: 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20 20  ? "persist" :.  
ad80: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
ad90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ada0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
adb0: 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a 0a   ? "truncate" :.
adc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
add0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ade0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
adf0: 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f 65     ? "wal" : "?e
ae00: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28  rror?".      , (
ae10: 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65 2c  int)p->tempFile,
ae20: 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c 20   (int)p->memDb, 
ae30: 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72 6e  (int)p->useJourn
ae40: 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  al.      , p->jo
ae50: 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75  urnalOff, p->jou
ae60: 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c 20  rnalHdr.      , 
ae70: 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c 20  (int)p->dbSize, 
ae80: 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53 69  (int)p->dbOrigSi
ae90: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46 69  ze, (int)p->dbFi
aea0: 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20 72  leSize.  );..  r
aeb0: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65  eturn zRet;.}.#e
aec0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
aed0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
aee0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
aef0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
af00: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
af10: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
af20: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
af30: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
af40: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
af50: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
af60: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
af70: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
af80: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
af90: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
afa0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
afb0: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
afc0: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
afd0: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
afe0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
aff0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b000: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b010: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b020: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b030: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
b040: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
b050: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67  gHdr *pPg){.  Pg
b060: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
b070: 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
b080: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
b090: 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  er;.  int i;.  f
b0a0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72  or(i=0; i<pPager
b0b0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b  ->nSavepoint; i+
b0c0: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
b0d0: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
b0e0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
b0f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  i];.    if( p->n
b100: 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d  Orig>=pgno && 0=
b110: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
b120: 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  st(p->pInSavepoi
b130: 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  nt, pgno) ){.   
b140: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b150: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b160: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
b170: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
b180: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
b190: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
b1a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
b1b0: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
b1c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b1d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b1e0: 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61  vecTest(pPg->pPa
b1f0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
b200: 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a   pPg->pgno);.}..
b210: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
b220: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
b230: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
b240: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
b250: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
b260: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
b270: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
b280: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
b290: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
b2a0: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
b2b0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
b2c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
b2d0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
b2e0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
b2f0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
b300: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
b310: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
b320: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b330: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
b340: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
b350: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
b360: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b370: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
b380: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
b390: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b3a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
b3b0: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
b3c0: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
b3d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b3e0: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
b3f0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
b400: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
b410: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
b420: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
b430: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
b440: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
b450: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a  yte((u8*)A,B)...
b460: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b470: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b480: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
b490: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
b4a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
b4b0: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
b4c0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b4d0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b4e0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
b4f0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
b500: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
b510: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
b520: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
b530: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
b540: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
b550: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
b560: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
b570: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
b580: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b590: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b5a0: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b5b0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b5c0: 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48  NO_LOCK.** or SH
b5d0: 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72  ARED_LOCK. Regar
b5e0: 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
b5f0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c   or not the call
b600: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
b610: 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74   succeeds, set t
b620: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
b630: 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68  ariable to match
b640: 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29   the (attempted)
b650: 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   new lock..**.**
b660: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
b670: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
b680: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
b690: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
b6a0: 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
b6b0: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b6c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
b6d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b6e0: 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f  ine of .** UNKNO
b6f0: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
b700: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
b710: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b720: 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  t pagerUnlockDb(
b730: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b740: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b750: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b760: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
b770: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b780: 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  de || pPager->eL
b790: 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock==eLock );.  
b7a0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e  assert( eLock==N
b7b0: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  O_LOCK || eLock=
b7c0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
b7d0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21    assert( eLock!
b7e0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65  =NO_LOCK || page
b7f0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
b800: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
b810: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
b820: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
b830: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  ager->eLock>=eLo
b840: 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ck );.    rc = s
b850: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
b860: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
b870: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
b880: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
b890: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
b8a0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b8b0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
b8c0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b8d0: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
b8e0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
b8f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
b910: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b920: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
b930: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
b940: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
b950: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
b960: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
b970: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
b980: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
b990: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
b9a0: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
b9b0: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
b9c0: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
b9d0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b9e0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b9f0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
ba00: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
ba10: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
ba20: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
ba30: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
ba40: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
ba50: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
ba60: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
ba70: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
ba80: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
ba90: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
baa0: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bab0: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bac0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bad0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bae0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
baf0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bb00: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bb10: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bb20: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bb30: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bb40: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bb50: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bb60: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bb70: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bb80: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
bb90: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
bba0: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
bbb0: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
bbc0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bbd0: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
bbe0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bbf0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
bc00: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
bc10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
bc20: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
bc30: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
bc40: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
bc50: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bc60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bc70: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bc80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
bc90: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
bca0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
bcb0: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
bcc0: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
bcd0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
bce0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
bcf0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
bd00: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
bd10: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
bd20: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
bd30: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
bd40: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
bd50: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
bd60: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
bd70: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
bd80: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
bd90: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bda0: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
bdb0: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
bdc0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
bdd0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
bde0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
bdf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
be00: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
be10: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
be20: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
be30: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
be40: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
be50: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
be60: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
be70: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
be80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
be90: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
bea0: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
beb0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
bec0: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
bed0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
bee0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
bef0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
bf00: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
bf10: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
bf20: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
bf30: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
bf40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
bf50: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
bf60: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
bf70: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
bf80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bf90: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
bfa0: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
bfb0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
bfc0: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
bff0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
c000: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
c010: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c020: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
c030: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
c040: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
c070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
c080: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c090: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
c0a0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
c0b0: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
c0c0: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
c0d0: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
c0e0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
c0f0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
c100: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
c110: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
c120: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
c130: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
c140: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c150: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
c160: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
c170: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
c180: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
c190: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
c1a0: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
c1b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c1c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
c1d0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
c1e0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
c1f0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c200: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
c210: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
c220: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
c230: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
c240: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
c250: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
c260: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
c270: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
c280: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
c290: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
c2a0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
c2b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c2c0: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
c2d0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
c2e0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
c2f0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
c300: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
c310: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
c320: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
c330: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c340: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c350: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c360: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c370: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c380: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c390: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c3a0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c3b0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c3c0: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
c3d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
c3e0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
c3f0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
c400: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
c410: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
c420: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
c430: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
c440: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c450: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
c460: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
c470: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
c480: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
c490: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
c4a0: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
c4b0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
c4c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c4d0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
c4e0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
c4f0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
c500: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
c510: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
c520: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
c530: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
c540: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
c550: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
c560: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
c570: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
c580: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
c590: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
c5a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
c5b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
c5c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
c5d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
c5e0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
c5f0: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
c600: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
c610: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
c620: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
c630: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
c640: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
c650: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
c660: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
c670: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
c680: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
c690: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c6a0: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
c6b0: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
c6c0: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
c6d0: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
c6e0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
c6f0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
c700: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
c710: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
c720: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
c730: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
c740: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
c750: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c760: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
c770: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c780: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
c790: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
c7a0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
c7b0: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
c7c0: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
c7d0: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
c7e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
c7f0: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
c800: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
c810: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c820: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
c830: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
c840: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
c850: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
c860: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
c870: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
c880: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
c890: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
c8a0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
c8b0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
c8c0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
c8d0: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
c8e0: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
c8f0: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
c900: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
c910: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
c920: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
c930: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
c940: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
c950: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
c960: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
c970: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
c980: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
c990: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
c9a0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
c9b0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
c9c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
c9d0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
c9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c9f0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
ca00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ca10: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
ca20: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
ca30: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
ca40: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
ca50: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
ca60: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
ca70: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
ca80: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
ca90: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
caa0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
cab0: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
cac0: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
cad0: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
cae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
caf0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
cb00: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
cb10: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
cb20: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
cb30: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
cb40: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
cb50: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
cb60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
cb70: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
cb80: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
cb90: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
cba0: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
cbb0: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
cbc0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
cbd0: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
cbe0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
cc10: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
cc40: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
cc50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
cc60: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cc80: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
cc90: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
cca0: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
ccb0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
ccc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
ccd0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
cce0: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
ccf0: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
cd20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
cd30: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
cd40: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
cd50: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
cd60: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
cd70: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
cd80: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
cd90: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
cda0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
cdb0: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
cdc0: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
cdd0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
cde0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
cdf0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
ce00: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
ce10: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c  aster .   || SQL
ce20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
ce30: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
ce40: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29  szJ-12, &cksum))
ce50: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
ce60: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
ce70: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
ce80: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a  gic, 8, szJ-8)).
ce90: 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61     || memcmp(aMa
cea0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
ceb0: 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c  ic, 8).   || SQL
cec0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
ced0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
cee0: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
cef0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20   szJ-16-len)).  
cf00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
cf10: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
cf20: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
cf30: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
cf40: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
cf50: 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  */.  for(u=0; u<
cf60: 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63  len; u++){.    c
cf70: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
cf80: 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  u];.  }.  if( ck
cf90: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
cfa0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
cfb0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
cfc0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
cfd0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
cfe0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
cff0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
d000: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d010: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
d020: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
d030: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
d040: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
d050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
d060: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
d070: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
d080: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
d090: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65  e..    */.    le
d0a0: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61  n = 0;.  }.  zMa
d0b0: 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ster[len] = '\0'
d0c0: 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  ;.   .  return S
d0d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d0e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  ** Return the of
d0f0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74  fset of the sect
d100: 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f  or boundary at o
d110: 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  r immediately .*
d120: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d130: 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d  value in pPager-
d140: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73  >journalOff, ass
d150: 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a  uming a sector .
d160: 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65  ** size of pPage
d170: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79  r->sectorSize by
d180: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  tes..**.** i.e f
d190: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
d1a0: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20   of 512:.**.**  
d1b0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
d1c0: 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72  f          Retur
d1d0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d  n value.**   ---
d1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d200: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d220: 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20      0.**   512  
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30       512.**   10
d250: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d260: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d270: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
d280: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
d290: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ** .*/.static i6
d2a0: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  4 journalHdrOffs
d2b0: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
d2c0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
d2d0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
d2e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d2f0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
d300: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
d310: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
d320: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
d350: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
d360: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d370: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
d380: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
d390: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
d3a0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
d3b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
d3c0: 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b    return offset;
d3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
d3e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
d3f0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
d400: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d410: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d420: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
d430: 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72  o-op if the jour
d440: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  nal file has not
d450: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
d460: 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63  .** within the c
d470: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
d480: 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65  on (i.e. if Page
d490: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29  r.journalOff==0)
d4a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75  ..**.** If doTru
d4b0: 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  ncate is non-zer
d4c0: 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a  o or the Pager.j
d4d0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d4e0: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73  variable is.** s
d4f0: 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72  et to 0, then tr
d500: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
d510: 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  al file to zero 
d520: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f  bytes in size. O
d530: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72  therwise,.** zer
d540: 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65  o the 28-byte he
d550: 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72  ader at the star
d560: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
d570: 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72   file. In either
d580: 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68   case, .** if th
d590: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
d5a0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
d5b0: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
d5c0: 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c   file immediatel
d5d0: 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74  y .** after writ
d5e0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
d5f0: 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  g it..**.** If P
d600: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
d610: 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20  Limit is set to 
d620: 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d  a positive, non-
d630: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a  zero value, and.
d640: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d650: 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a   truncation or z
d660: 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64  eroing described
d670: 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20   above the size 
d680: 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e  of the .** journ
d690: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
d6a0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
d6b0: 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e  this value, then
d6c0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
d6d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
d6e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d6f0: 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54  zeLimit bytes. T
d700: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d710: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64  does.** not need
d720: 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f   to be synced fo
d730: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
d740: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  ration..**.** If
d750: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d760: 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f  urs, abandon pro
d770: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d780: 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  rn the IO error 
d790: 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  code..** Otherwi
d7a0: 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  se, return SQLIT
d7b0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
d7c0: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
d7d0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
d7e0: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
d7f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
d800: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d830: 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
d840: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d850: 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20  ->jfd) );.  if( 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d870: 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ff ){.    const 
d880: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
d890: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
d8a0: 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  Limit;    /* Loc
d8b0: 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20  al cache of jsl 
d8c0: 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28  */..    IOTRACE(
d8d0: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
d8e0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
d8f0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c  f( doTruncate ||
d900: 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20   iLimit==0 ){.  
d910: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d920: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
d930: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
d940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61  }else{.      sta
d950: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
d960: 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d  eroHdr[28] = {0}
d970: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
d980: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
d990: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
d9a0: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
d9b0: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
d9c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d9d0: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
d9e0: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
d9f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
da00: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
da10: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
da20: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
da30: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  Flags);.    }.. 
da40: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
da50: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
da60: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
da70: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
da80: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
da90: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
daa0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
dab0: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
dac0: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
dad0: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
dae0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
daf0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
db00: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
db10: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
db20: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
db30: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
db40: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
db50: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
db60: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
db70: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
db80: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
db90: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
dba0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dbb0: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
dbc0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
dbd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
dbe0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
dbf0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
dc00: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
dc10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
dc20: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
dc30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dc40: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
dc50: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
dc60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
dc70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
dc80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
dc90: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
dca0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
dcb0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
dcc0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
dcd0: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
dce0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
dcf0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
dd00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
dd10: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
dd20: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
dd30: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
dd40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
dd50: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
dd60: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
dd70: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
dd80: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
dd90: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
dda0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
ddb0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
ddc0: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
ddd0: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
dde0: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
ddf0: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
de00: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
de10: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
de20: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
de30: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
de40: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
de50: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
de60: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
de70: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
de80: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
de90: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
dea0: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
deb0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
dec0: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
ded0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
dee0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
def0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
df00: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
df10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df30: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
df40: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
df50: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
df60: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
df70: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
df80: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
df90: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
dfa0: 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  = (u32)pPager->p
dfb0: 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20  ageSize;/* Size 
dfc0: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
dfd0: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
dfe0: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e010: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
e020: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
e030: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
e060: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
e070: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e080: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
e090: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
e0a0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
e0b0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
e0c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e0d0: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
e0e0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
e0f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
e100: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
e110: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
e120: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
e130: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
e140: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
e150: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
e160: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
e170: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
e180: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
e190: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
e1a0: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
e1b0: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
e1c0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
e1d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
e1e0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
e1f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
e200: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
e210: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
e220: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
e230: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
e240: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
e250: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
e260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
e270: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e280: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
e290: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
e2a0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
e2b0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
e2c0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
e2d0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
e2e0: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
e2f0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
e300: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
e310: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
e320: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
e330: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
e340: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
e350: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
e360: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
e370: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
e380: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
e390: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
e3a0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
e3b0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
e3c0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
e3d0: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
e3e0: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
e3f0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
e400: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
e410: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
e420: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
e430: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
e440: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
e450: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
e460: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
e470: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
e480: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
e490: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e4a0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
e4b0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
e4c0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
e4d0: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
e4e0: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
e4f0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e500: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
e510: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
e520: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
e530: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
e540: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
e550: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
e560: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
e570: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
e580: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
e590: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
e5a0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
e5b0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
e5c0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
e5d0: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
e5e0: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
e5f0: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
e600: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
e610: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
e620: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
e630: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
e640: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
e650: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
e660: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
e670: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
e680: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
e690: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e6a0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
e6b0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
e6c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
e6d0: 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  nc || (pPager->j
e6e0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
e6f0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
e700: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
e710: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
e720: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
e730: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
e740: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
e750: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
e760: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
e770: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
e780: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e790: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
e7a0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
e7b0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
e7c0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
e7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
e7e0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
e7f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
e800: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
e810: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
e820: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
e830: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
e840: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
e850: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
e860: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
e870: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
e880: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e890: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e8a0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
e8b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e8c0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
e8d0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
e8e0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e8f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e900: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
e910: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
e920: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
e930: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
e940: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
e950: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
e960: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e970: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e980: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
e990: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
e9a0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
e9b0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
e9c0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
e9d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
e9e0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
e9f0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
ea00: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
ea10: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
ea20: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
ea30: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
ea40: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
ea50: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ea60: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
ea70: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
ea80: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
ea90: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
eaa0: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
eab0: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
eac0: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
ead0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
eae0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
eaf0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
eb00: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
eb10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
eb20: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
eb30: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
eb40: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
eb50: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
eb60: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
eb70: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
eb80: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
eb90: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
eba0: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
ebb0: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
ebc0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
ebd0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
ebe0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
ebf0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
ec00: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
ec10: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
ec20: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
ec30: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
ec40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
ec50: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
ec60: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
ec70: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
ec80: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
ec90: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
eca0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
ecb0: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
ecc0: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
ecd0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
ece0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
ecf0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
ed00: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
ed10: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
ed20: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed30: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
ed40: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
ed50: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
ed60: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
ed70: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
ed80: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ed90: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
eda0: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
edb0: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
edc0: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
edd0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
ede0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
edf0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
ee00: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
ee10: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
ee20: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
ee30: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
ee40: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
ee50: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
ee60: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
ee70: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
ee80: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
ee90: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
eea0: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
eeb0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
eec0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
eed0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
eee0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
eef0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
ef00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
ef10: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
ef20: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
ef30: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
ef40: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
ef50: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
ef60: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
ef70: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
ef80: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
ef90: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
efa0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
efb0: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
efc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
efd0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
efe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eff0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
f000: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
f010: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f020: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
f030: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
f040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
f050: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
f060: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
f070: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
f080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f090: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
f0a0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
f0b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
f0e0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
f0f0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
f100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f110: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
f120: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f130: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
f140: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
f150: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
f160: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
f170: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
f180: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
f190: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
f1a0: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
f1b0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
f1c0: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
f1d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
f1e0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
f1f0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
f200: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
f210: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
f220: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
f230: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
f240: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
f250: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
f260: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
f270: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
f280: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
f290: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
f2a0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
f2b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
f2c0: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
f2d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
f2e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f2f0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
f300: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
f310: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
f320: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
f330: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
f340: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
f350: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
f360: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
f370: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
f380: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f390: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
f3a0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
f3b0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
f3c0: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
f3d0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
f3e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
f3f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
f400: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
f410: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
f420: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f430: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
f440: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
f450: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
f460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f470: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
f480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
f490: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
f4a0: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f4c0: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
f4d0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
f4e0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
f4f0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f510: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
f520: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
f530: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
f540: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
f550: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
f560: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
f570: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
f580: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
f590: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
f5a0: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
f5b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
f5c0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
f5d0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
f5e0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f5f0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
f600: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
f610: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
f620: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
f630: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
f640: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
f650: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
f660: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
f670: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
f680: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
f690: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
f6a0: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
f6b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f6c0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
f6d0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
f6e0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f6f0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
f700: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
f710: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
f720: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f730: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
f740: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
f750: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
f760: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
f770: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
f780: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
f790: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
f7a0: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
f7b0: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
f7c0: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
f7d0: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
f7e0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
f7f0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
f800: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
f810: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
f820: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
f830: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
f840: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
f850: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
f860: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
f870: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
f880: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
f890: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
f8a0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f8b0: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
f8c0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
f8d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f8e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
f8f0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
f900: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
f910: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
f920: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f930: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
f950: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
f960: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
f970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f980: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
f990: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
f9a0: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
f9b0: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
f9c0: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
f9d0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
f9e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
f9f0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fa00: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
fa10: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
fa20: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
fa30: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fa40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fa50: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
fa60: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
fa70: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fa80: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
fa90: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
faa0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
fab0: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
fac0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fad0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
fae0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
faf0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
fb00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
fb10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
fb20: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
fb30: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
fb40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fb50: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
fb60: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
fb70: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
fb80: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
fb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
fba0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
fbb0: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fbc0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
fbd0: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
fbe0: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
fbf0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
fc00: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
fc10: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
fc20: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
fc30: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
fc40: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
fc50: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
fc60: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fc70: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
fc80: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
fc90: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
fca0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
fcb0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
fcc0: 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66    /* Versions of
fcd0: 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
fce0: 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70   3.5.8 set the p
fcf0: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fd00: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  f the.    ** jou
fd10: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a  rnal header to z
fd20: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
fd30: 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  e, assume that t
fd40: 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  he Pager.pageSiz
fd50: 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  e.    ** variabl
fd60: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  e is already set
fd70: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
fd80: 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  page size..    *
fd90: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fda0: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
fdb0: 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  iPageSize = pPag
fdc0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
fdd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
fde0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
fdf0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fe00: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fe10: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73  ctor-size fields
fe20: 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68  .    ** are with
fe30: 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20  in range. To be 
fe40: 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68  'in range', both
fe50: 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20   values need to 
fe60: 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a  be a power.    *
fe70: 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  * of two greater
fe80: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
fe90: 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64  o 512 or 32, and
fea0: 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61   not greater tha
feb0: 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20  n their .    ** 
fec0: 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69  respective compi
fed0: 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20  le time maximum 
fee0: 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  limits..    */. 
fef0: 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
ff00: 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20  <512            
ff10: 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72        || iSector
ff20: 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20  Size<32.     || 
ff30: 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  iPageSize>SQLITE
ff40: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c  _MAX_PAGE_SIZE |
ff50: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41  | iSectorSize>MA
ff60: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  X_SECTOR_SIZE.  
ff70: 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a     || ((iPageSiz
ff80: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21  e-1)&iPageSize)!
ff90: 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f  =0   || ((iSecto
ffa0: 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72  rSize-1)&iSector
ffb0: 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b  Size)!=0 .    ){
ffc0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ffd0: 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65   either the page
ffe0: 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d  -size or sector-
fff0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
10000 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20  nal-header is . 
10010 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c       ** invalid,
10020 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
10030 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65  s that wrote the
10040 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10050 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20  must have .     
10060 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f   ** crashed befo
10070 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61  re the header wa
10080 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69  s synced. In thi
10090 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64  s case stop read
100a0 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ing .      ** th
100b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
100c0 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
100d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
100e0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
100f0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10100 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61   page-size to ma
10110 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65  tch the value re
10120 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
10130 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65  nal. .    ** Use
10140 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61   a testcase() ma
10150 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  cro to make sure
10160 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69   that malloc fai
10170 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20  lure within .   
10180 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65   ** PagerSetPage
10190 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64  size() is tested
101a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
101b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
101c0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
101d0 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31  , &iPageSize, -1
101e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
101f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10200 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
10210 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
10220 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
10230 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
10240 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   by .    ** the 
10250 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
10260 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
10270 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
10280 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72  al was.    ** cr
10290 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
102a0 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
102b0 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
102c0 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  s routine.    **
102d0 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
102e0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
102f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
10300 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
10310 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73     ** of Pager.s
10320 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
10330 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
10340 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
10350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
10360 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
10370 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
10380 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
10390 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
103a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
103b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
103c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
103d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
103e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
103f0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10400 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
10410 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
10420 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
10430 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
10440 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
10450 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
10460 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
10470 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
10480 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
10490 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
104a0 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
104b0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
104c0 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
104d0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
104e0 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
104f0 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
10500 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
10510 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
10520 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47    + 4 bytes: PAG
10530 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20  ER_MJ_PGNO..**  
10540 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74   + N bytes: Mast
10550 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
10560 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a  ame in utf-8..**
10570 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20     + 4 bytes: N 
10580 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65  (length of maste
10590 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
105a0 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d  n bytes, no nul-
105b0 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20  terminator)..** 
105c0 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73    + 4 bytes: Mas
105d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
105e0 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20   checksum..**   
105f0 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
10600 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
10610 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
10620 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
10630 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
10640 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
10650 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
10660 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20  nal name, where 
10670 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  each byte is int
10680 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69  erpreted as a si
10690 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67  gned 8-bit integ
106a0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  er..**.** If zMa
106b0 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
106c0 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
106d0 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
106e0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
106f0 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
10700 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10710 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
10720 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
10730 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
10740 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
10750 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10770 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10780 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  code */.  int nM
10790 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
107a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
107b0 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a  ngth of string z
107c0 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20  Master */.  i64 
107d0 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
107f0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
10800 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   in journal file
10810 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69   */.  i64 jrnlSi
10820 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10830 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10840 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  f journal file o
10850 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20  n disk */.  u32 
10860 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20  cksum = 0;      
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10880 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69  Checksum of stri
10890 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20  ng zMaster */.. 
108a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
108b0 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
108c0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
108d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
108e0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  );..  if( !zMast
108f0 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  er .   || pPager
10900 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10910 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10920 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70  _MEMORY .   || p
10930 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
10940 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
10950 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a  LMODE_OFF .  ){.
10960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10970 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10980 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10990 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  1;.  assert( isO
109a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
109b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
109c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
109d0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
109e0 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20  nalOff );..  /* 
109f0 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65  Calculate the le
10a00 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e  ngth in bytes an
10a10 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f  d the checksum o
10a20 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66  f zMaster */.  f
10a30 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d  or(nMaster=0; zM
10a40 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20  aster[nMaster]; 
10a50 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20  nMaster++){.    
10a60 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
10a70 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a  [nMaster];.  }..
10a80 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
10a90 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
10aa0 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
10ab0 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
10ac0 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
10ad0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10ae0 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
10af0 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
10b00 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
10b10 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
10b20 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
10b30 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
10b40 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
10b50 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
10b60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10b70 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
10b80 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
10b90 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
10ba0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10bb0 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  Off;..  /* Write
10bc0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10bd0 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20  nal data to the 
10be0 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
10bf0 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a  al file. If.  **
10c00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
10c10 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
10c20 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
10c30 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  aller..  */.  if
10c40 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  ( (0 != (rc = wr
10c50 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10c60 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20  ->jfd, iHdrOff, 
10c70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
10c80 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28  ager)))).   || (
10c90 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
10ca0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10cb0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
10cc0 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66  nMaster, iHdrOff
10cd0 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  +4))).   || (0 !
10ce0 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10cf0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10d00 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
10d10 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20  er, nMaster))). 
10d20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10d30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10d40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10d50 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63  f+4+nMaster+4, c
10d60 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30  ksum))).   || (0
10d70 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
10d80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10d90 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
10da0 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b  gic, 8, iHdrOff+
10db0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
10dc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10dd0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
10de0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
10df0 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
10e00 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
10e10 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
10e20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
10e30 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
10e40 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
10e50 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
10e60 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
10e70 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10e80 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
10e90 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
10ea0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
10eb0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
10ec0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
10ed0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
10ee0 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
10ef0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
10f00 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
10f10 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
10f20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
10f30 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
10f40 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
10f50 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
10f60 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
10f70 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
10f80 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
10f90 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
10fa0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
10fb0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
10fc0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
10fd0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
10fe0 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
10ff0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11000 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11010 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11020 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11030 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11040 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11060 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11070 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11080 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
11090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
110a0 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
110b0 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
110c0 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
110d0 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
110e0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
110f0 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
11100 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
11110 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
11120 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
11130 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
11140 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
11150 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
11160 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
11170 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
111a0 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
111b0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
111c0 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
111d0 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
111e0 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
111f0 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
11200 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
11210 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
11220 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
11230 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
11240 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
11250 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
11260 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
11270 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
11280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11290 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
112a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
112b0 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
112c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
112d0 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
112e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
112f0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
11300 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
11310 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
11320 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
11330 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
11340 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11350 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11360 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11370 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11380 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11390 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
113a0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
113b0 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
113c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
113d0 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
113e0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
113f0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11400 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
11410 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
11420 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
11430 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11440 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11450 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11460 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11470 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11480 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11490 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
114a0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
114b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
114c0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
114d0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
114e0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
114f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
11500 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
11510 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
11520 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
11530 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
11540 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
11550 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
11560 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11570 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11580 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
11590 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
115a0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
115b0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
115c0 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
115d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
115e0 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
115f0 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
11600 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
11610 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
11620 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
11630 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
11640 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
11650 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
11660 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
11670 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
11680 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
11690 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
116a0 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
116b0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
116c0 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
116f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
11700 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11710 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
11720 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
11730 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11740 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11750 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
11760 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
11770 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
11780 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
11790 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
117a0 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
117b0 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
117c0 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
117d0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
117e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
117f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
11810 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11820 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
11830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11840 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11850 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
11860 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11870 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
11880 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  nd not.** in the
11890 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
118a0 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69 74  herwise, it swit
118b0 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 74  ches the pager t
118c0 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20  o PAGER_OPEN.** 
118d0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  state..**.** If 
118e0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
118f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
11900 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64  cess mode, the d
11910 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
11920 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e  ** completely un
11930 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66  locked. If the f
11940 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20  ile is unlocked 
11950 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73  and the file-sys
11960 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  tem does.** not 
11970 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44 45  exhibit the UNDE
11980 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
11990 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20  N property, the 
119a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a  journal file is.
119b0 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74  ** closed (if it
119c0 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a   is open)..**.**
119d0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
119e0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
119f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
11a00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
11a10 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
11a20 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
11a30 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  e are discarded 
11a40 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67  before switching
11a50 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65   back to .** the
11a60 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67   OPEN state. Reg
11a70 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
11a80 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  er the pager is 
11a90 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
11aa0 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79  e.** or not, any
11ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65   journal file le
11ac0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
11ad0 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72  ystem will be tr
11ae0 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f  eated.** as a ho
11af0 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
11b00 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65  lled back the ne
11b10 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74  xt time a read-t
11b20 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
11b30 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69 73   opened (by this
11b40 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72   or by any other
11b50 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f   connection)..*/
11b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11b70 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
11b80 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73  *pPager){..  ass
11b90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11ba0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
11bb0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  R .       || pPa
11bc0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11bd0 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20  ER_OPEN .       
11be0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
11bf0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a  e==PAGER_ERROR .
11c00 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42    );..  sqlite3B
11c10 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
11c20 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
11c30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
11c40 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
11c50 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
11c60 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  ts(pPager);..  i
11c70 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
11c80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
11c90 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
11ca0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
11cb0 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52    sqlite3WalEndR
11cc0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
11cd0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
11ce0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
11cf0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
11d00 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
11d10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
11d20 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11d50 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62 79  code returned by
11d60 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29   pagerUnlockDb()
11d70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20   */.    int iDc 
11d80 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
11d90 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65  >fd)?sqlite3OsDe
11da0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11db0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a  ics(pPager->fd):
11dc0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
11dd0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11de0 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74  em support delet
11df0 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ion of open file
11e00 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63  s, then.    ** c
11e10 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
11e20 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
11e30 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
11e40 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73   lock.  Otherwis
11e50 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72  e.    ** another
11e60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
11e70 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
11e80 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74  lete might delet
11e90 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  e the file.    *
11ea0 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  * out from under
11eb0 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
11ec0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11ed0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
11ee0 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20  Y   & 5)!=1 );. 
11ef0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11f00 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
11f10 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29  F      & 5)!=1 )
11f20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11f30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11f40 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d  _WAL      & 5)!=
11f50 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f60 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f70 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35  ODE_DELETE   & 5
11f80 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f90 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11fa0 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
11fb0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
11fc0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11fd0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
11fe0 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  T  & 5)==1 );.  
11ff0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20    if( 0==(iDc & 
12000 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
12010 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12020 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28  EN).     || 1!=(
12030 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
12040 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a  ode & 5).    ){.
12050 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12060 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
12070 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12080 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
12090 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
120a0 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ate and the call
120b0 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
120c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
120d0 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74  ile fails, set t
120e0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20  he current lock 
120f0 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
12100 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
12110 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68  .    ** above th
12120 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e  e #define for UN
12130 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
12140 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
12150 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a   why this.    **
12160 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
12170 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
12180 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
12190 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  ger, NO_LOCK);. 
121a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
121b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
121c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
121d0 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ROR ){.      pPa
121e0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b  ger->eLock = UNK
121f0 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  NOWN_LOCK;.    }
12200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ..    /* The pag
12210 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65 20  er state may be 
12220 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47  changed from PAG
12230 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45  ER_ERROR to PAGE
12240 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20  R_OPEN here.    
12250 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72  ** without clear
12260 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f  ing the error co
12270 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65  de. This is inte
12280 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72  ntional - the er
12290 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20  ror.    ** code 
122a0 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74  is cleared and t
122b0 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20 69  he cache reset i
122c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f  n the block belo
122d0 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
122e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
122f0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
12300 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
12310 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67  RROR );.    pPag
12320 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
12330 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  one = 0;.    pPa
12340 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12350 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20  GER_OPEN;.  }.. 
12360 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
12370 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
12380 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12390 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
123a0 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73  not be.  ** trus
123b0 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
123c0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
123d0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
123e0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a  s to the pager,.
123f0 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65    ** it can safe
12400 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20  ly move back to 
12410 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
12420 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  . This happens i
12430 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d  n both.  ** norm
12440 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  al and exclusive
12450 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20  -locking mode.. 
12460 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12470 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12480 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
12490 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  );.    pager_res
124a0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
124b0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
124c0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
124d0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
124e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
124f0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12500 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12520 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
12530 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
12540 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12550 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
12560 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
12570 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
12580 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12590 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49 4f 45   whenever an IOE
125a0 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72  RR or FULL error
125b0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 2a   that requires.*
125c0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74  * the pager to t
125d0 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74  ransition into t
125e0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 6d  he ERROR state m
125f0 61 79 20 61 68 76 65 20 6f 63 63 75 72 72 65 64  ay ahve occurred
12600 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  ..** The first a
12610 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
12620 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
12630 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
12640 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20   second .** the 
12650 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
12660 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
12670 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
12680 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a  unction. The .**
12690 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
126a0 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
126b0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
126c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
126d0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
126e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
126f0 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c   is SQLITE_FULL,
12700 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
12710 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49   one of the.** I
12720 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73 2c 20  OERR sub-codes, 
12730 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
12740 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12750 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
12760 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ode.** is stored
12770 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64   in Pager.errCod
12780 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  e. While the pag
12790 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20 74 68  er remains in th
127a0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a  e ERROR state,.*
127b0 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20  * all major API 
127c0 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50 61 67  calls on the Pag
127d0 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
127e0 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67 65 72  ely return Pager
127f0 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  .errCode..**.** 
12800 54 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  The ERROR state 
12810 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
12820 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12830 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
12840 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
12850 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
12860 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
12870 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
12880 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
12890 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
128a0 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
128b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
128c0 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
128d0 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
128e0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
128f0 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
12900 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
12910 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
12920 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
12930 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12940 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12950 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
12960 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
12970 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
12980 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
12990 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
129a0 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
129b0 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
129c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
129d0 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
129e0 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
129f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12a00 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
12a10 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
12a20 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
12a30 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
12a40 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
12a50 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
12a60 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
12a70 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
12a80 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
12a90 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
12aa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12ab0 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
12ac0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12ad0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
12ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
12af0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
12b00 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
12b10 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b  er, Pgno nPage);
12b20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12b30 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
12b40 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
12b50 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
12b60 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
12b70 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
12b80 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
12b90 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
12ba0 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
12bb0 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
12bc0 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
12bd0 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
12be0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
12bf0 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
12c00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12c10 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
12c20 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
12c30 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
12c40 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
12c50 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ction..** .** Th
12c60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
12c70 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50 41  ver called in PA
12c80 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
12c90 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65 64   If it is called
12ca0 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e  .** in PAGER_NON
12cb0 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52 45  E or PAGER_SHARE
12cc0 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  D state and the 
12cd0 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65 73  lock held is les
12ce0 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 74  s.** exclusive t
12cf0 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  han a RESERVED l
12d00 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  ock, it is a no-
12d10 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  op..**.** Otherw
12d20 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20  ise, any active 
12d30 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72  savepoints are r
12d40 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eleased..**.** I
12d50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12d60 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e  le is open, then
12d70 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65   it is "finalize
12d80 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e  d". Once a journ
12d90 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20  al .** file has 
12da0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69  been finalized i
12db0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
12dc0 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72  e to use it to r
12dd0 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74  oll back a .** t
12de0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20  ransaction. Nor 
12df0 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69  will it be consi
12e00 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f  dered to be a ho
12e10 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69  t-journal by thi
12e20 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65  s.** or any othe
12e30 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
12e40 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68  ction. Exactly h
12e50 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ow a journal is 
12e60 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70  finalized.** dep
12e70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
12e80 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72  or not the pager
12e90 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
12ea0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e  xclusive mode an
12eb0 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  d.** the current
12ec0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50   journal-mode (P
12ed0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
12ee0 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c   value), as foll
12ef0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ows:.**.**   jou
12f00 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
12f10 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
12f20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12f30 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64  is simply closed
12f40 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20  . This destroys 
12f50 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65  an .**     in-me
12f60 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  mory journal..**
12f70 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12f80 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20  e==TRUNCATE.**  
12f90 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
12fa0 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  is truncated to 
12fb0 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
12fc0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ze..**.**   jour
12fd0 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
12fe0 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73  .**     The firs
12ff0 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68  t 28 bytes of th
13000 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
13010 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20  re zeroed. This 
13020 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20  invalidates.**  
13030 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75     the first jou
13040 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  rnal header in t
13050 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e  he file, and hen
13060 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  ce the entire jo
13070 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
13080 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f  e. An invalid jo
13090 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
130a0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
130b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
130c0 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a  lMode==DELETE.**
130d0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
130e0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20   file is closed 
130f0 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e  and deleted usin
13100 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
13110 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49  e()..**.**     I
13120 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
13130 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13140 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d  ive mode, this m
13150 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a  ethod of finaliz
13160 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a  ing.**     the j
13170 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
13180 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65  ever used. Inste
13190 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ad, if the journ
131a0 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20  alMode is.**    
131b0 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
131c0 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
131d0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
131e0 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64  method described
131f0 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f   under.**     jo
13200 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13210 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65  ST is used inste
13220 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  ad..**.** After 
13230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  the journal is f
13240 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70 61  inalized, the pa
13250 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47  ger moves to PAG
13260 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 2e  ER_READER state.
13270 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69  .** If running i
13280 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20  n non-exclusive 
13290 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74  rollback mode, t
132a0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  he lock on the f
132b0 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67  ile is .** downg
132c0 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52 45  raded to a SHARE
132d0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51  D_LOCK..**.** SQ
132e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
132f0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
13300 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
13310 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
13320 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  g.** any of the 
13330 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  IO operations to
13340 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13350 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e  urnal file or un
13360 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  lock the.** data
13370 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f  base then the IO
13380 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
13390 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
133a0 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  ser. If the .** 
133b0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e  operation to fin
133c0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
133d0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68  l file fails, th
133e0 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c  en the code stil
133f0 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e  l.** tries to un
13400 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
13410 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e  e file if not in
13420 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
13430 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63   If the.** unloc
13440 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  k operation fail
13450 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20  s as well, then 
13460 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13470 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  code related.** 
13480 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72  to the first err
13490 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28  or encountered (
134a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  the journal fina
134b0 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73  lization one) is
134c0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
134d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
134e0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
134f0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
13500 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c 20   int hasMaster, 
13510 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
13520 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13530 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
13540 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
13550 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13560 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
13570 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
13580 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
13590 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
135a0 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
135b0 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f  tion */..  /* Do
135c0 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20   nothing if the 
135d0 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
135e0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
135f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
13600 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20 61  ** or at least a
13610 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
13620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
13630 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
13640 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
13650 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
13660 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20 61  ion active but a
13670 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
13680 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a  ater lock is.  *
13690 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77 6f  * held under two
136a0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
136b0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41    **.  **   1. A
136c0 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
136d0 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  l hot-journal ro
136e0 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63 61  llback, it is ca
136f0 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 20  lled with.  **  
13700 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47 45      eState==PAGE
13710 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b  R_NONE and eLock
13720 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13730 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e  ..  **.  **   2.
13740 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   If a connection
13750 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f   with locking_mo
13760 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f 6c  de=exclusive hol
13770 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
13780 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63  E .  **      loc
13790 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b 20  k switches back 
137a0 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  to locking_mode=
137b0 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20  normal and then 
137c0 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a 20  executes a.  ** 
137d0 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73 61       read-transa
137e0 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63  ction, this func
137f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
13800 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47 45  ith eState==PAGE
13810 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20 20  R_READER .  **  
13820 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45      and eLock==E
13830 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68  XCLUSIVE_LOCK wh
13840 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  en the read-tran
13850 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
13860 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
13870 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
13880 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
13890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
138a0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
138b0 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20 70  ERROR );.  if( p
138c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
138d0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
138e0 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  D && pPager->eLo
138f0 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  ck<RESERVED_LOCK
13900 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
13910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
13920 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
13930 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 20  oints(pPager);. 
13940 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
13950 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
13960 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13970 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  al==0 );.  if( i
13980 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13990 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
139a0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
139b0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f  Pager) );..    /
139c0 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  * Finalize the j
139d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
139e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
139f0 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
13a00 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13a20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13a30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13a40 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20  _MEMORY );.     
13a50 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13a60 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13a70 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
13a80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a90 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13aa0 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  DE_TRUNCATE ){. 
13ab0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
13ac0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
13ad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
13ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13af0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
13b00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
13b10 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
13b20 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, 0);.      }. 
13b30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13b40 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
13b50 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
13b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13b70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13b80 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
13b90 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
13ba0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
13bb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13bc0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
13bd0 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a  ODE_WAL).    ){.
13be0 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a        rc = zeroJ
13bf0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13c00 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20  , hasMaster);.  
13c10 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13c20 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
13c30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
13c40 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20  This branch may 
13c50 62 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68  be executed with
13c60 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
13c70 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20  de==MEMORY if.  
13c80 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75      ** a hot-jou
13c90 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f  rnal was just ro
13ca0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68  lled back. In th
13cb0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
13cc0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
13cd0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
13ce0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20  ed and deleted. 
13cf0 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  If this connecti
13d00 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20  on writes to.   
13d10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
13d20 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c  se file, it will
13d30 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20   do so using an 
13d40 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
13d50 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  l. .      */.   
13d60 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d     int bDelete =
13d70 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   (!pPager->tempF
13d80 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33 4a 6f  ile && sqlite3Jo
13d90 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50 61 67  urnalExists(pPag
13da0 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20  er->jfd));.     
13db0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13dc0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13dd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13de0 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
13df0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e00 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13e20 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
13e30 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13e40 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13e50 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
13e60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
13e70 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13e80 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
13e90 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a   if( bDelete ){.
13ea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13eb0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
13ec0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
13ed0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
13ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13ef0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
13f00 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
13f10 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
13f20 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
13f30 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
13f40 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
13f50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
13f60 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
13f70 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
13f80 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13f90 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
13fa0 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b   *p = pager_look
13fb0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
13fc0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
13fd0 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
13fe0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
13ff0 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a 20  PagerUnref(p);. 
14000 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14010 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
14020 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
14030 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
14040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14050 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
14060 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
14070 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14080 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14090 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
140a0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
140b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
140c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
140d0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
140e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
140f0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
14100 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
14110 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
14120 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
14130 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
14140 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
14150 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
14160 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
14170 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
14180 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
14190 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
141a0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
141b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
141c0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
141d0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
141e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
141f0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
14200 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
14210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
14220 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d  ommit && pPager-
14230 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67  >dbFileSize>pPag
14240 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14250 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14260 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63   is taken when c
14270 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
14280 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62  saction in rollb
14290 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ack-journal.    
142a0 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64  ** mode if the d
142b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
142c0 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74  disk is larger t
142d0 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  han the database
142e0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41   image..    ** A
142f0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
14300 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
14310 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
14320 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14330 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
14340 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20  ully committed, 
14350 62 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56  but the EXCLUSIV
14360 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20  E lock is still 
14370 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  held on the.    
14380 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69  ** file. So it i
14390 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61  s safe to trunca
143a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
143b0 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69  file to its mini
143c0 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  mum.    ** requi
143d0 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20  red size.  */.  
143e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
143f0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
14400 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  VE_LOCK );.    r
14410 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
14420 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
14430 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
14440 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
14450 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
14460 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57    && (!pagerUseW
14470 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71  al(pPager) || sq
14480 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
14490 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
144a0 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20  al, 0)).  ){.   
144b0 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f   rc2 = pagerUnlo
144c0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
144d0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
144e0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
144f0 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
14500 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
14510 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
14520 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
14530 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74  ster = 0;..  ret
14540 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
14550 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
14560 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
14570 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
14580 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14590 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
145a0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
145b0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
145c0 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
145d0 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
145e0 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f   ERROR state, do
145f0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
14600 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
14610 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
14620 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
14630 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
14640 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14650 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
14660 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
14670 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
14680 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
14690 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
146a0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61  ove the pager ba
146b0 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  ck to OPEN state
146c0 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65  . If this .** me
146d0 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ans that there i
146e0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
146f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
14700 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
14710 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  t .** connection
14720 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
14730 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
14740 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
14750 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a   be this one) .*
14760 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62  * will roll it b
14770 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14780 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
14790 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
147a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
147b0 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
147c0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
147d0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
147e0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
147f0 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
14800 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
14810 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
14820 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63  RROR state. Whic
14830 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
14840 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
14850 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14860 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
14870 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
14880 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
14890 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
148a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
148b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
148c0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
148d0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
148e0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b  e!=PAGER_OPEN ){
148f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
14900 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
14910 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69  pPager) );.    i
14920 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
14930 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
14940 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20  LOCKED ){.      
14950 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
14960 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
14970 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
14980 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
14990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
149a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
149b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
149c0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
149d0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Mode ){.      as
149e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
149f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
14a00 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ER );.      page
14a10 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
14a20 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  n(pPager, 0, 0);
14a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
14a40 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
14a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
14a60 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
14a70 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14a80 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
14a90 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
14aa0 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
14ab0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
14ac0 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
14ad0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
14ae0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
14af0 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
14b00 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
14b10 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
14b30 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
14b40 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
14b50 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
14b60 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
14b70 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
14b80 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14b90 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
14ba0 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
14bb0 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
14bc0 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
14bd0 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
14be0 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
14bf0 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
14c00 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
14c10 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
14c20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
14c30 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
14c40 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
14c50 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
14c60 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
14c70 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
14c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14c90 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
14ca0 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
14cb0 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
14cc0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
14cd0 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
14ce0 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
14cf0 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
14d00 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
14d10 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
14d20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
14d30 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
14d40 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
14d50 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
14d60 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
14d70 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
14d80 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
14d90 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
14da0 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
14db0 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
14dc0 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
14dd0 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
14de0 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
14df0 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
14e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
14e10 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
14e20 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
14e30 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
14e40 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
14e50 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
14e60 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
14e70 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
14e80 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
14e90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
14ea0 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
14eb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
14ec0 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
14ed0 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
14ee0 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
14ef0 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
14f00 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
14f10 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
14f20 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
14f30 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
14f40 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
14f50 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
14f60 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
14f70 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
14f80 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
14f90 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
14fa0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14fb0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
14fc0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
14fd0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
14fe0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
14ff0 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
15000 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
15030 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
15040 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
15050 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
15060 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
15070 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
15080 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
15090 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
150a0 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
150b0 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
150c0 72 20 70 42 75 66 20 74 6f 20 6f 66 66 73 65 74  r pBuf to offset
150d0 20 69 4f 66 66 20 6f 66 20 74 68 65 20 0a 2a 2a   iOff of the .**
150e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
150f0 49 66 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  If this part of 
15100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15110 65 20 69 73 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e is memory mapp
15120 65 64 2c 0a 2a 2a 20 75 73 65 20 6d 65 6d 63 70  ed,.** use memcp
15130 79 28 29 20 74 6f 20 64 6f 20 73 6f 2e 20 4f 74  y() to do so. Ot
15140 68 65 72 77 69 73 65 2c 20 63 61 6c 6c 20 73 71  herwise, call sq
15150 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 2e 0a  lite3OsWrite()..
15160 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
15170 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
15180 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
15190 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
151a0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
151b0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
151c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 44 61  ite3PagerWriteDa
151d0 74 61 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ta(Pager *pPager
151e0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
151f0 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 69 36  uf, int nBuf, i6
15200 34 20 69 4f 66 66 29 7b 0a 20 20 69 6e 74 20 72  4 iOff){.  int r
15210 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61   if( pPager->nMa
15230 70 56 61 6c 69 64 3e 3d 28 69 4f 66 66 2b 6e 42  pValid>=(iOff+nB
15240 75 66 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  uf) ){.    memcp
15250 79 28 26 28 28 75 38 20 2a 29 28 70 50 61 67 65  y(&((u8 *)(pPage
15260 72 2d 3e 70 4d 61 70 29 29 5b 69 4f 66 66 5d 2c  r->pMap))[iOff],
15270 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20   pBuf, nBuf);.  
15280 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
15290 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
152a0 50 61 67 65 72 2d 3e 66 64 2c 20 70 42 75 66 2c  Pager->fd, pBuf,
152b0 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 0a 20 20   nBuf, iOff);.  
152c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
152d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
152e0 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
152f0 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
15300 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
15310 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
15320 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15330 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
15340 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
15350 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
15360 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
15370 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
15380 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
15390 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
153a0 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
153b0 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
153c0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
153d0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
153e0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
153f0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
15400 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63  ournal uses chec
15410 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
15420 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
15430 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a  es .** not..**.*
15440 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
15450 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
15460 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f   record read fro
15470 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15480 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  nal file.** is g
15490 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
154a0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
154b0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
154c0 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a  hen playback is.
154d0 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53  ** skipped and S
154e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
154f0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rned..**.** If p
15500 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Done is not NULL
15510 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
15520 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74  ecord of pages t
15530 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  hat have already
15540 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20  .** been played 
15550 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61  back.  If the pa
15560 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68  ge at *pOffset h
15570 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
15580 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28  played back.** (
15590 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
155a0 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69  ding pDone bit i
155b0 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70  s set) then skip
155c0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a   the playback..*
155d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
155e0 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73  pDone bit corres
155f0 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a  ponding to the *
15600 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20  pOffset page is 
15610 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  set.** prior to 
15620 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
15630 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63   If the page rec
15640 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75  ord is successfu
15650 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
15660 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15670 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79  file.** and play
15680 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51  ed back, then SQ
15690 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
156a0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
156b0 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68  ror occurs.** wh
156c0 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  ile reading the 
156d0 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
156e0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
156f0 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74  le or while writ
15700 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ing.** to the da
15710 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
15720 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
15730 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
15740 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73   If data.** is s
15750 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
15760 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74  journal file but
15780 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a   appears to be.*
15790 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  * corrupted, SQL
157a0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
157b0 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f  rned. Data is co
157c0 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74  nsidered corrupt
157d0 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72  ed in.** two cir
157e0 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a  cumstances:.** .
157f0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
15800 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72  cord page-number
15810 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f   is illegal (0 o
15820 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29  r PAGER_MJ_PGNO)
15830 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74  , or.**   * If t
15840 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69  he record is bei
15850 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66  ng rolled back f
15860 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
15870 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
15880 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
15890 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74  m field does not
158a0 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72   match the recor
158b0 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  d content..**.**
158c0 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73   Neither of thes
158d0 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20  e two scenarios 
158e0 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72  are possible dur
158f0 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ing a savepoint 
15900 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
15910 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76  If this is a sav
15920 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c  epoint rollback,
15930 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79   then memory may
15940 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61   have to be dyna
15950 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
15960 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
15970 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69  ction. If this i
15980 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61  s the case and a
15990 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  n allocation fai
159a0 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ls,.** SQLITE_NO
159b0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
159c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
159d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
159e0 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20  e_page(.  Pager 
159f0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
15a00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15a10 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65  ager being playe
15a20 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20  d back */.  i64 
15a30 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20  *pOffset,       
15a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
15a50 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  set of record to
15a60 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42   playback */.  B
15a70 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20  itvec *pDone,   
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a90 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  Bitvec of pages 
15aa0 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62  already played b
15ab0 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
15ac0 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
15ad0 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
15ae0 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
15af0 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
15b00 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e  /.  int isSavepn
15b10 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15b20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
15b30 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15b40 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
15b50 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
15b80 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
15b90 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
15ba0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
15bb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
15bc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
15bd0 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
15be0 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
15c10 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
15c20 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  ecking */.  char
15c30 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
15c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
15c50 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66  porary storage f
15c60 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  or the page */. 
15c70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
15c80 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fd;            /
15c90 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
15ca0 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  iptor for the jo
15cb0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
15cc0 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20  int isSynced;   
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15ce0 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
15cf0 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20   page is synced 
15d00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  */..  assert( (i
15d10 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
15d20 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
15d30 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
15d40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
15d50 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
15d60 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
15d70 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
15d80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
15d90 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
15da0 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
15db0 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
15dc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
15dd0 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
15de0 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
15df0 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
15e00 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
15e10 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
15e20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e  aData = pPager->
15e30 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73  pTmpSpace;.  ass
15e40 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20  ert( aData );   
15e50 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
15e60 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  orage must have 
15e70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
15e80 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65  ocated */.  asse
15e90 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
15ea0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21  pPager)==0 || (!
15eb0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73  isMainJrnl && is
15ec0 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f  Savepnt) );..  /
15ed0 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61  * Either the sta
15ee0 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  te is greater th
15ef0 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  an PAGER_WRITER_
15f00 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e  CACHEMOD (a tran
15f10 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72  saction .  ** or
15f20 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15f30 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20  ack done at the 
15f40 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63  request of the c
15f50 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69  aller) or this i
15f60 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  s.  ** a hot-jou
15f70 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
15f80 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f  f it is a hot-jo
15f90 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
15fa0 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69  the pager.  ** i
15fb0 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20  s in state OPEN 
15fc0 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43  and holds an EXC
15fd0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74  LUSIVE lock. Hot
15fe0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
15ff0 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64  k.  ** only read
16000 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
16010 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65  journal, not the
16020 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
16030 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
16040 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
16050 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16060 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  OD.       || (pP
16070 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
16080 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67  GER_OPEN && pPag
16090 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
160a0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
160b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
160c0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
160d0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
160e0 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b  || isMainJrnl );
160f0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
16100 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
16110 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
16120 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
16130 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
16140 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
16150 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
16160 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
16170 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
16180 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
16190 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
161a0 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
161b0 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
161c0 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
161d0 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
161e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
161f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
16210 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
16220 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
16230 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
16240 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
16250 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
16260 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
16270 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
16280 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
16290 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
162a0 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
162b0 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
162c0 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
162d0 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
162e0 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
162f0 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
16300 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
16310 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
16320 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
16330 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
16340 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
16350 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
16360 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
16370 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
16380 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
16390 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
163a0 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
163b0 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
163c0 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
163d0 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
163e0 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
163f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
16400 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
16410 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
16420 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
16430 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
16440 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
16450 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
16460 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
16470 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
16480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16490 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
164a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
164b0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
164c0 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
164d0 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
164e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
164f0 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
16500 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
16510 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
16520 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
16530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16540 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
16550 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
16560 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
16570 65 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65  een played by be
16580 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
16590 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
165a0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
165b0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
165c0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
165d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
165e0 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
165f0 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
16600 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
16610 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16620 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
16630 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
16640 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
16650 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
16660 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
16670 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
16680 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
16690 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
166a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
166b0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
166c0 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
166d0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
166e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
166f0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
16700 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
16710 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
16720 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
16730 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
16740 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16750 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
16760 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
16770 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
16780 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
16790 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
167a0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
167b0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
167c0 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
167d0 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
167e0 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
167f0 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
16800 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
16810 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
16820 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
16830 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
16840 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
16850 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
16860 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
16870 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
16880 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
16890 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
168a0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
168b0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
168c0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
168d0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
168e0 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
168f0 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
16900 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
16910 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
16920 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
16930 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
16940 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
16950 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
16960 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
16970 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
16980 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
16990 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
169a0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
169b0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
169c0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
169d0 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
169e0 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
169f0 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
16a00 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
16a10 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
16a20 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
16a30 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
16a40 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
16a50 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
16a60 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
16a70 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
16a80 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
16a90 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
16aa0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
16ab0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
16ac0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
16ad0 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
16ae0 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
16af0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
16b00 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
16b10 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
16b20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
16b30 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
16b40 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
16b50 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
16b60 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
16b70 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
16b80 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
16b90 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
16ba0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
16bb0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
16bc0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
16bd0 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
16be0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
16bf0 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
16c00 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
16c10 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
16c20 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
16c30 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
16c40 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
16c50 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
16c60 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
16c70 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
16c80 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
16c90 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
16ca0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16cb0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
16cc0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
16cd0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
16ce0 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
16cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
16d00 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
16d10 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
16d20 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
16d30 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
16d40 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
16d50 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
16d60 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
16d70 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
16d80 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
16d90 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
16da0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
16db0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
16dc0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
16dd0 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
16de0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
16df0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
16e00 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
16e10 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
16e20 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
16e30 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
16e40 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
16e50 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
16e60 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
16e70 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
16e80 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
16e90 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
16ea0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
16eb0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
16ec0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
16ed0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
16ee0 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
16ef0 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
16f00 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
16f10 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
16f20 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
16f30 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
16f40 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61  se{.    pPg = pa
16f50 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
16f60 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
16f70 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
16f80 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
16f90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
16fa0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e!=PAGER_OPEN ||
16fb0 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47   pPg==0 );.  PAG
16fc0 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
16fd0 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
16fe0 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
16ff0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
17000 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
17010 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  , pager_datahash
17020 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
17030 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a  e, (u8*)aData),.
17040 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61             (isMa
17050 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75  inJrnl?"main-jou
17060 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e  rnal":"sub-journ
17070 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28  al").  ));.  if(
17080 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
17090 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50     isSynced = pP
170a0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
170b0 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61  (*pOffset <= pPa
170c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
170d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
170e0 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d  sSynced = (pPg==
170f0 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
17100 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44  ags & PGHDR_NEED
17110 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69  _SYNC));.  }.  i
17120 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
17130 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61  ->fd).   && (pPa
17140 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
17150 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
17160 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
17170 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
17180 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
17190 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
171a0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
171b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
171c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
171d0 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
171e0 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
171f0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
17200 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
17210 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
17220 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
17230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17240 61 67 65 72 57 72 69 74 65 44 61 74 61 28 70 50  agerWriteData(pP
17250 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 50 61  ager, aData, pPa
17260 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
17270 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
17280 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
17290 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
172a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
172b0 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
172c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
172d0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20  pBackup ){.     
172e0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
172f0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  aData, pgno, 3, 
17300 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
17310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
17320 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
17330 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
17340 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a  o, (u8*)aData);.
17350 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
17360 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17370 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
17380 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20  OMEM, aData);.  
17390 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
173a0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70  !isMainJrnl && p
173b0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
173c0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
173d0 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70  lback of a savep
173e0 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61  oint and data wa
173f0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
17400 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
17410 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67  base and the pag
17420 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f  e is not in-memo
17430 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70  ry, there is a p
17440 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20  otential.    ** 
17450 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68  problem. When th
17460 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66  e page is next f
17470 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d  etched by the b-
17480 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a  tree layer, it .
17490 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72      ** will be r
174a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
174b0 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63  abase file, whic
174c0 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
174d0 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72   be .    ** curr
174e0 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ent. .    **.   
174f0 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20   ** There are a 
17500 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72  couple of differ
17510 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61  ent ways this ca
17520 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72  n happen. All ar
17530 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f  e quite.    ** o
17540 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e  bscure. When run
17550 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e  ning in synchron
17560 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  ous mode, this c
17570 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a  an only happen .
17580 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61      ** if the pa
17590 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65  ge is on the fre
175a0 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74  e-list at the st
175b0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
175c0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  action, then.   
175d0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74   ** populated, t
175e0 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20  hen moved using 
175f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
17600 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  page()..    **. 
17610 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
17620 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20  on is to add an 
17630 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74  in-memory page t
17640 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  o the cache cont
17650 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  aining.    ** th
17660 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64  e data just read
17670 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
17680 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20  urnal. Mark the 
17690 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20  page as dirty . 
176a0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
176b0 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20   pager requires 
176c0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20  a journal-sync, 
176d0 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61  then mark the pa
176e0 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65  ge as .    ** re
176f0 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61  quiring a journa
17700 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74  l-sync before it
17710 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   is written..   
17720 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17730 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17750 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
17760 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
17770 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20  NotSpill++;.    
17780 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17790 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c  rAcquire(pPager,
177a0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
177b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
177c0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d  ger->doNotSpill=
177d0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
177e0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a  ->doNotSpill--;.
177f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17800 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17810 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
17820 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
17830 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17840 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17850 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17860 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17870 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17880 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17890 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
178a0 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
178b0 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
178c0 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
178d0 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
178e0 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
178f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
17900 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
17910 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
17920 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
17930 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17940 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17950 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17960 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17970 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17980 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17990 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
179a0 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
179b0 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
179c0 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
179d0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
179e0 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
179f0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17a00 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
17a10 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
17a20 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
17a30 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17a40 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17a50 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17a60 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17a70 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17a80 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17a90 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17aa0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17ab0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17ac0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17ad0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
17ae0 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
17af0 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
17b00 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17b10 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
17b20 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
17b30 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17b40 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17b50 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17b60 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17b70 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17b80 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17b90 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17ba0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17bb0 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17bc0 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17bd0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
17be0 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
17bf0 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
17c00 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
17c10 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
17c20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
17c30 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17c40 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17c50 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17c60 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
17c70 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
17c80 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
17c90 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
17ca0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
17cb0 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
17cc0 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
17cd0 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
17ce0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
17cf0 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
17d00 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
17d10 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
17d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
17d30 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
17d40 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
17d50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
17d60 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
17d70 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
17d80 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
17d90 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
17da0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
17db0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
17dc0 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
17dd0 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
17de0 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
17df0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
17e00 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
17e10 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
17e20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
17e30 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
17e40 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
17e50 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
17e60 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
17e70 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
17e80 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
17e90 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
17ea0 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
17eb0 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
17ec0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
17ed0 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
17ee0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
17ef0 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
17f00 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
17f20 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
17f30 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17f40 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
17f50 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
17f60 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
17f70 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
17f80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
17f90 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
17fa0 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
17fb0 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
17fc0 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
17fd0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
17fe0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
17ff0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
18000 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
18010 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
18020 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
18030 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
18040 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
18050 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
18060 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
18070 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
18080 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18090 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
180a0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
180b0 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
180c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
180d0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
180e0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
180f0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
18100 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
18110 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
18120 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
18130 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
18140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
18150 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
18160 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
18170 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18180 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18190 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
181a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
181b0 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
181c0 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
181d0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
181e0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
181f0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
18200 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
18210 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
18220 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
18230 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
18240 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
18250 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18260 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
18270 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18280 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18290 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
182a0 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
182b0 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
182c0 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
182d0 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
182e0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
182f0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
18300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18310 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
18320 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
18330 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
18340 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
18350 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
18360 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
18370 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18380 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18390 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
183a0 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
183b0 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
183c0 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
183d0 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
183e0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
183f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18400 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
18410 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
18420 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
18430 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
18440 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
18450 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18460 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
18470 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18480 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18490 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
184a0 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
184b0 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
184c0 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
184d0 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
184e0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
184f0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
18500 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
18510 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
18520 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
18530 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18540 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
18550 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
18560 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
18570 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18580 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18590 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
185a0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
185b0 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
185c0 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
185d0 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
185e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
185f0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
18600 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
18610 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
18620 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
18630 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
18640 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
18650 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
18660 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
18670 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18680 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18690 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
186a0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
186b0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
186c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
186d0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
186e0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
186f0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18700 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18710 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
18720 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
18730 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
18740 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
18750 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
18760 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
18770 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18780 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18790 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
187a0 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
187b0 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
187c0 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
187d0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
187e0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
187f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18800 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18810 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
18820 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
18830 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18840 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18850 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18860 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18870 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18880 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18890 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
188a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
188b0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
188c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
188d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
188e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
188f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18900 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18910 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
18920 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18930 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18940 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18950 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18960 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18970 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18980 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18990 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
189a0 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
189b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
189c0 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
189d0 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
189e0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
189f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18a00 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
18a10 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
18a20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
18a30 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18a40 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18a50 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18a60 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18a70 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18a80 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18a90 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18aa0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18ab0 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18ac0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18ad0 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
18ae0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
18af0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
18b00 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
18b10 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
18b20 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
18b30 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18b40 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18b50 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18b60 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18b70 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18b80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18b90 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18ba0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18bb0 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18bc0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18bd0 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
18be0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
18bf0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
18c00 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
18c10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18c20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
18c30 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18c40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18c50 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18c60 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18c70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18c80 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18c90 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18ca0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18cc0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18cd0 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
18ce0 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
18cf0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18d00 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
18d10 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
18d20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
18d30 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18d40 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18d50 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18d60 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18d70 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18d80 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18d90 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18da0 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18db0 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18dc0 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18dd0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
18de0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
18df0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
18e00 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
18e10 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
18e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18e30 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18e40 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18e50 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18e60 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18e70 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18e80 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18e90 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18ea0 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18eb0 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18ec0 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18ed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18ee0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18ef0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
18f00 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
18f10 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18f20 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
18f30 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18f40 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18f50 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18f60 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18f70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18f80 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18f90 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18fa0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18fb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18fc0 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18fd0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
18fe0 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
18ff0 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
19000 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
19010 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
19020 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
19030 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
19040 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
19050 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
19060 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
19070 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
19090 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
190a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
190b0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
190c0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
190d0 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
190e0 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
190f0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
19100 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
19110 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
19120 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
19130 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
19140 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
19150 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
19160 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
19170 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
19180 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19190 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
191a0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
191b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
191c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
191d0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
191e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
191f0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
19200 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
19210 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
19220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19230 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
19240 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19250 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
19260 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
19270 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
19280 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
19290 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
192a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
192b0 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
192c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
192d0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
192e0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
192f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
19300 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
19310 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
19320 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
19330 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
19340 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
19350 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
19360 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
19370 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19380 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
19390 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
193a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
193b0 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
193c0 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
193d0 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
193e0 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
193f0 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
19400 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
19410 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
19420 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
19430 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
19440 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
19450 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
19460 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
19470 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
19480 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
19490 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
194a0 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
194b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
194c0 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
194d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
194e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
194f0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
19500 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
19510 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
19520 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
19530 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
19540 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
19550 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
19560 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
19570 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
19580 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
19590 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
195a0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
195b0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
195c0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
195d0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
195e0 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
195f0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
19600 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
19610 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
19620 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19630 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
19640 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
19650 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
19660 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
19670 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
19680 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
19690 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
196a0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
196b0 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
196c0 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
196d0 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
196e0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
196f0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
19700 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
19710 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
19720 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
19730 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
19740 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
19750 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
19760 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
19770 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
19780 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
19790 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
197a0 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
197b0 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
197c0 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
197d0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
197e0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
197f0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
19800 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
19810 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
19820 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
19830 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
19840 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
19850 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
19860 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19870 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19880 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19890 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
198a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
198b0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
198c0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
198d0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
198e0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
198f0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19900 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19910 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19920 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
19930 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19940 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
19950 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19960 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19970 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19980 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19990 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
199a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
199b0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
199c0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
199d0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
199e0 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
199f0 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
19a00 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
19a10 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
19a20 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
19a30 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
19a40 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
19a50 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
19a60 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
19a70 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
19a80 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
19a90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19aa0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
19ab0 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
19ac0 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
19ad0 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
19ae0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19af0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
19b00 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
19b10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
19b20 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
19b30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
19b40 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
19b50 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
19b60 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  ewSize);.       
19b70 20 69 66 28 20 6e 65 77 53 69 7a 65 3c 70 50 61   if( newSize<pPa
19b80 67 65 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 29  ger->nMapValid )
19b90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
19ba0 65 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d 20  er->nMapValid = 
19bb0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  newSize;.       
19bc0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
19bd0 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b  f( (currentSize+
19be0 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65  szPage)<=newSize
19bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
19c00 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d   *pTmp = pPager-
19c10 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
19c20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c      memset(pTmp,
19c30 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20   0, szPage);.   
19c40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
19c50 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
19c60 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  == currentSize )
19c70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
19c80 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50  se( (newSize-szP
19c90 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53  age) >  currentS
19ca0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ize );.        r
19cb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19cc0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
19cd0 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77  Tmp, szPage, new
19ce0 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20  Size-szPage);.  
19cf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19d10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
19d20 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
19d30 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
19d40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
19d60 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20  urn a sanitized 
19d70 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73  version of the s
19d80 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53  ector-size of OS
19d90 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65   file pFile. The
19da0 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
19db0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
19dc0 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32  o lie between 32
19dd0 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f   and MAX_SECTOR_
19de0 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  SIZE..*/.int sql
19df0 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73  ite3SectorSize(s
19e00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
19e10 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20  le){.  int iRet 
19e20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19e30 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20  rSize(pFile);.  
19e40 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20  if( iRet<32 ){. 
19e50 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20     iRet = 512;. 
19e60 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e   }else if( iRet>
19e70 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19e80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
19e90 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
19ea0 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20  512 );.    iRet 
19eb0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
19ec0 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
19ed0 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  iRet;.}../*.** S
19ee0 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
19ef0 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
19f00 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
19f10 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
19f20 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
19f30 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19f40 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19f50 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
19f60 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
19f70 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
19f80 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
19f90 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
19fa0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
19fb0 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
19fc0 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
19fd0 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
19fe0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
19ff0 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
1a000 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
1a010 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
1a020 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
1a030 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a040 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
1a050 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
1a060 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
1a070 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
1a080 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
1a090 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a0a0 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
1a0b0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1a0c0 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
1a0d0 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
1a0e0 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
1a0f0 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
1a100 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
1a110 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
1a120 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
1a130 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
1a140 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a  SECTOR_SIZE..**.
1a150 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68  ** If the file h
1a160 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  as the SQLITE_IO
1a170 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1a180 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79  ERWRITE property
1a190 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68  , then set.** th
1a1a0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a1b0 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d  or size to its m
1a1c0 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31  inimum value (51
1a1d0 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  2).  The purpose
1a1e0 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73   of.** pPager->s
1a1f0 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20  ectorSize is to 
1a200 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73  define the "blas
1a210 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74  t radius" of byt
1a220 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  es that.** might
1a230 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61   change if a cra
1a240 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  sh occurs while 
1a250 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e  writing to a sin
1a260 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74  gle byte in.** t
1a270 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20  hat range.  But 
1a280 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f  with POWERSAFE_O
1a290 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c  VERWRITE, the bl
1a2a0 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65  ast radius is ze
1a2b0 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77  ro.** (that is w
1a2c0 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  hat POWERSAFE_OV
1a2d0 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20  ERWRITE means), 
1a2e0 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  so we minimize t
1a2f0 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a  he sector.** siz
1a300 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64  e.  For backward
1a310 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
1a320 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1a330 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a340 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f  mat,.** we canno
1a350 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  t reduce the eff
1a360 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
1a370 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f  ze below 512..*/
1a380 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
1a390 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
1a3a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
1a3b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a3c0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1a3d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
1a3e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
1a3f0 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71  mpFile.   || (sq
1a400 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1a410 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1a420 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20  ger->fd) & .    
1a430 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1a440 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1a450 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20  _OVERWRITE)!=0. 
1a460 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
1a470 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
1a480 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
1a490 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
1a4a0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
1a4b0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
1a4c0 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
1a4d0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
1a4e0 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
1a4f0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
1a500 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20   segfault. */.  
1a510 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
1a520 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65  Size = 512;.  }e
1a530 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
1a540 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
1a550 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
1a560 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
1a570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
1a580 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
1a590 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
1a5a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a5b0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
1a5c0 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
1a5d0 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
1a5e0 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
1a5f0 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
1a600 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
1a610 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
1a620 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
1a630 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
1a640 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
1a650 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
1a660 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a670 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
1a690 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
1a6a0 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
1a6b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
1a6c0 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
1a6d0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
1a6e0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
1a6f0 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
1a700 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
1a710 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
1a720 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
1a730 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a740 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a750 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
1a760 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
1a770 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
1a780 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
1a790 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
1a7a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1a7b0 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
1a7c0 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
1a7d0 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
1a7e0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
1a7f0 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
1a800 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a810 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
1a820 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
1a830 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
1a840 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
1a850 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
1a860 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
1a870 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a880 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
1a890 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
1a8a0 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
1a8b0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
1a8c0 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
1a8d0 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
1a8e0 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
1a8f0 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
1a900 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
1a910 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
1a920 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
1a930 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a940 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
1a950 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1a960 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
1a970 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
1a980 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1a990 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
1a9a0 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
1a9b0 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
1a9c0 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
1a9d0 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
1a9e0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
1a9f0 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
1aa00 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
1aa10 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
1aa20 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
1aa30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1aa40 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
1aa50 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
1aa60 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
1aa70 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
1aa80 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
1aa90 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
1aaa0 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
1aab0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1aac0 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
1aad0 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
1aae0 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
1aaf0 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
1ab00 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
1ab10 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
1ab20 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
1ab30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1ab40 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
1ab50 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
1ab60 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
1ab70 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
1ab80 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
1ab90 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
1aba0 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
1abb0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1abc0 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
1abd0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
1abe0 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
1abf0 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
1ac00 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
1ac10 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
1ac20 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
1ac30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1ac40 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
1ac50 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
1ac60 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
1ac70 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
1ac80 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1ac90 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
1aca0 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
1acb0 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
1acc0 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
1acd0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
1ace0 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
1acf0 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
1ad00 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
1ad10 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
1ad20 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
1ad30 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
1ad40 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
1ad50 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
1ad60 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
1ad70 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
1ad80 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
1ad90 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1ada0 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
1adb0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
1adc0 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
1add0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
1ade0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
1adf0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
1ae00 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
1ae10 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1ae20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
1ae30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ae40 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
1ae50 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
1ae60 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
1ae70 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
1ae80 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
1ae90 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
1aea0 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
1aeb0 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
1aec0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
1aed0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1aee0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
1aef0 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
1af00 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
1af10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1af20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1af30 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
1af40 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
1af50 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
1af60 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
1af70 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
1af80 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
1af90 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
1afa0 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
1afb0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
1afc0 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
1afd0 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
1afe0 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
1aff0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
1b000 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
1b010 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
1b020 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
1b030 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
1b040 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
1b050 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
1b060 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
1b070 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
1b080 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
1b090 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
1b0a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
1b0b0 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
1b0c0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
1b0d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1b0e0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1b0f0 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
1b100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b110 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1b120 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
1b130 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1b140 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
1b150 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b160 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
1b170 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
1b180 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
1b190 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1b1a0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1b1b0 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
1b1c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1b1d0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
1b1e0 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
1b1f0 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1b220 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
1b230 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
1b240 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
1b250 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
1b260 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
1b270 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
1b280 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
1b290 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
1b2a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b2b0 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
1b2c0 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
1b2d0 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
1b2e0 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
1b2f0 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
1b300 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20  e rollback */.. 
1b310 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1b320 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
1b330 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
1b340 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
1b350 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
1b360 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
1b370 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
1b380 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1b390 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
1b3a0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1b3b0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
1b3c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1b3d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1b3e0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1b3f0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
1b400 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1b410 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
1b420 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
1b430 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
1b440 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1b450 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
1b460 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
1b470 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
1b480 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
1b490 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
1b4a0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
1b4b0 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
1b4c0 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
1b4d0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
1b4e0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
1b4f0 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
1b500 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
1b510 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
1b520 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
1b530 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
1b540 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
1b550 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
1b560 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
1b570 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
1b580 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
1b590 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1b5a0 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
1b5b0 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
1b5c0 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
1b5d0 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
1b5e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
1b5f0 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
1b600 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
1b610 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
1b620 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1b630 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
1b640 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
1b650 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
1b660 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
1b670 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b680 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
1b690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1b6a0 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
1b6b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1b6c0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
1b6d0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
1b6e0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
1b6f0 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
1b700 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1b710 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
1b720 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1b730 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
1b740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b750 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
1b760 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
1b770 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
1b780 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
1b790 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
1b7a0 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
1b7b0 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
1b7c0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
1b7d0 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
1b7e0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
1b7f0 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
1b800 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
1b810 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
1b820 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
1b830 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
1b840 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
1b850 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
1b860 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
1b870 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
1b880 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1b890 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
1b8a0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
1b8b0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
1b8c0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
1b8d0 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20 66  cess must have f
1b8e0 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
1b8f0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
1b900 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
1b910 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
1b920 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
1b930 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
1b940 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
1b950 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74  dr(pPager, isHot
1b960 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
1b970 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
1b980 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
1b990 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b9a0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1b9b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b9c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1b9d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b9e0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
1b9f0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1ba00 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1ba10 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
1ba20 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
1ba30 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
1ba40 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
1ba50 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
1ba60 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
1ba70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1ba80 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
1ba90 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
1baa0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
1bab0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
1bac0 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
1bad0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
1bae0 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
1baf0 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
1bb00 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
1bb10 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
1bb20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bb30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bb40 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bb50 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1bb60 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1bb70 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
1bb80 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
1bb90 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1bba0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1bbb0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
1bbc0 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
1bbd0 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
1bbe0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
1bbf0 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
1bc00 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
1bc10 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
1bc20 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
1bc30 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
1bc40 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
1bc50 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
1bc60 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1bc70 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
1bc80 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
1bc90 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
1bca0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
1bcb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1bcc0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
1bcd0 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
1bce0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
1bcf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1bd00 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
1bd10 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
1bd20 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
1bd30 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20  t #2565..    ** 
1bd40 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
1bd50 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c  k a hot journal,
1bd60 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20   nRec==0 always 
1bd70 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e  means that the n
1bd80 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b  ext.    ** chunk
1bd90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1bda0 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61  contains zero pa
1bdb0 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  ges to be rolled
1bdc0 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20   back.  But.    
1bdd0 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20  ** when doing a 
1bde0 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65  ROLLBACK and the
1bdf0 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69   nRec==0 chunk i
1be00 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b  s the last chunk
1be10 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
1be20 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73  ournal, it means
1be30 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1be40 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
1be50 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a  additional.    *
1be60 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  * pages that nee
1be70 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  d to be rolled b
1be80 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
1be90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1bea0 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20   .    ** should 
1beb0 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65  be computed base
1bec0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1bed0 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20   file size..    
1bee0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1bef0 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
1bf00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bf10 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
1bf20 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bf30 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
1bf40 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
1bf50 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
1bf60 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
1bf70 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
1bf80 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
1bf90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1bfa0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1bfb0 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
1bfc0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1bfd0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1bfe0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1bff0 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ile back to its 
1c000 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
1c010 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1c020 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c030 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1c040 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c050 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
1c060 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
1c070 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1c080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c090 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c0a0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c0b0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1c0c0 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
1c0d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
1c0e0 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
1c0f0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
1c100 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
1c110 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  to the .    ** d
1c120 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1c130 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a  /or page cache..
1c140 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
1c150 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
1c160 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
1c170 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20  PagerReset ){.  
1c180 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1c190 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1c1a0 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65     needPagerRese
1c1b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1c1c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c1d0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1c1e0 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65 72  e(pPager,&pPager
1c1f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31  ->journalOff,0,1
1c200 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ,0);.      if( r
1c210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c220 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c230 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1c240 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c250 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c260 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c270 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c280 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c290 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c2a0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c2b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c2c0 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c2d0 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c2e0 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c2f0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c300 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c310 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c320 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c330 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c340 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c350 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c360 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c370 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c380 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c390 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c3a0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c3b0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c3c0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c3d0 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c3e0 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c3f0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c400 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c430 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c440 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c460 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c470 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c480 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c490 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c4a0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c4b0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c4c0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c4d0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c4e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c4f0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c500 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c510 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c520 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c530 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c540 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c550 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c560 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c570 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c580 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c590 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c5a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c5b0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c5c0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c5d0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c5e0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c5f0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c610 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c620 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c630 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c640 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c650 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c660 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c670 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c680 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c690 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c6a0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c6b0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c6c0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c6d0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c6e0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c6f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c700 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c710 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c720 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c730 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c740 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c750 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c760 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c770 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c780 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c790 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c7a0 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c7b0 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c7c0 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c7d0 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c7e0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c7f0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c800 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c810 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c820 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c830 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c840 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c850 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c860 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c870 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c880 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c890 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c8a0 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c8b0 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c8c0 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c8d0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c8e0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c8f0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c900 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c910 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c920 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c930 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c940 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c950 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c960 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c970 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c980 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1c990 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1c9a0 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1c9b0 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1c9c0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1c9d0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c9e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c9f0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1ca00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1ca10 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1ca20 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1ca30 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1ca40 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1ca50 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1ca60 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1ca70 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1ca80 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1ca90 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1caa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cab0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1cac0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1cad0 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1cae0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1caf0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1cb00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cb10 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1cb20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1cb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb40 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1cb50 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1cb60 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1cb70 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1cb80 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1cb90 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1cba0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cbb0 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1cbc0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1cbd0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1cbe0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1cbf0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1cc00 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1cc10 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1cc20 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1cc30 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1cc40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1cc50 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1cc60 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1cc70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1cc80 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1cc90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1cca0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
1ccb0 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1ccc0 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
1ccd0 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
1cce0 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
1ccf0 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
1cd00 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1cd10 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
1cd20 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
1cd30 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
1cd40 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
1cd50 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1cd60 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
1cd70 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
1cd80 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
1cd90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1cda0 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1cdb0 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
1cdc0 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1cdd0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
1cde0 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1cdf0 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1ce00 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1ce10 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1ce20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1ce30 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1ce40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1ce50 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1ce60 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1ce70 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1ce80 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1ce90 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1cea0 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1ceb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cec0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1ced0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1cee0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1cef0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1cf00 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1cf10 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1cf20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1cf30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cf40 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1cf50 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d   *pPg, u32 iFram
1cf60 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  e){.  Pager *pPa
1cf70 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1cf80 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
1cf90 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
1cfa0 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
1cfb0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
1cfc0 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
1cfd0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1cfe0 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
1cff0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1d000 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1d010 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70   code */.  int p
1d020 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  gsz = pPager->pa
1d030 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65  geSize; /* Numbe
1d040 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
1d050 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
1d060 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1d070 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
1d080 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
1d090 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1d0a0 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66  er->fd) );..  if
1d0b0 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28  ( NEVER(!isOpen(
1d0c0 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
1d0d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d0e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1d0f0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
1d100 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
1d110 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1d120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d130 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 46  K;.  }..  if( iF
1d140 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d150 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d160 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d170 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d180 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d190 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d1a0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d1b0 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d1c0 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Data);.  }else{.
1d1d0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1d1e0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1d1f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d200 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1d210 2d 3e 70 4d 61 70 20 26 26 20 70 50 61 67 65 72  ->pMap && pPager
1d220 2d 3e 6e 4d 61 70 56 61 6c 69 64 3e 3d 69 4f 66  ->nMapValid>=iOf
1d230 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67  fset+pPager->pag
1d240 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  eSize ){.      m
1d250 65 6d 63 70 79 28 70 50 67 2d 3e 70 44 61 74 61  emcpy(pPg->pData
1d260 2c 20 26 28 28 75 38 20 2a 29 28 70 50 61 67 65  , &((u8 *)(pPage
1d270 72 2d 3e 70 4d 61 70 29 29 5b 69 4f 66 66 73 65  r->pMap))[iOffse
1d280 74 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  t], pPager->page
1d290 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
1d2a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1d2b0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1d2c0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1d2d0 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1d2e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1d2f0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1d300 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1d310 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d320 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1d330 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d340 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d350 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d360 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d370 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d380 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d390 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d3a0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d3b0 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d3c0 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d3d0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d3e0 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d3f0 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d400 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d410 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d420 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d430 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d440 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d450 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d460 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d470 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d480 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d490 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d4a0 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d4b0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d4c0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d4d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d4e0 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d4f0 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d500 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d510 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d520 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d530 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d540 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d550 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d560 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d570 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d580 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d590 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d5a0 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d5b0 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
1d5c0 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
1d5d0 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
1d5e0 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
1d5f0 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
1d600 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
1d610 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
1d620 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d630 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
1d640 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1d650 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
1d660 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
1d670 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
1d680 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
1d690 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
1d6a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d6b0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1d6c0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1d6d0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1d6e0 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
1d6f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
1d700 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
1d710 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
1d720 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1d730 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1d740 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1d750 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1d760 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1d770 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1d780 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d790 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1d7a0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1d7b0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1d7c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d7d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1d7e0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1d7f0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1d800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d810 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1d820 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1d830 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1d840 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1d850 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1d860 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1d870 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d880 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1d890 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1d8a0 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1d8b0 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1d8c0 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1d8d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1d8e0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1d8f0 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1d900 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d910 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1d920 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1d930 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1d940 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1d950 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1d960 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1d970 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1d980 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1d990 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1d9a0 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1d9b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1d9c0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1d9d0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1d9e0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1d9f0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1da00 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1da10 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1da20 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1da30 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1da40 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1da50 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1da60 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1da70 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1da80 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1da90 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1daa0 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1dab0 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1dac0 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1dad0 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1dae0 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1daf0 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1db00 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1db10 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1db20 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1db30 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1db40 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1db50 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1db60 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1db70 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1db80 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1db90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dba0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1dbb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1dbc0 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1dbd0 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1dbe0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1dbf0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1dc00 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1dc10 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1dc20 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1dc30 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1dc40 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1dc50 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1dc60 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1dc70 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1dc80 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1dc90 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1dca0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1dcb0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1dcc0 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1dcd0 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1dce0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1dcf0 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1dd00 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1dd10 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1dd20 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1dd30 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1dd40 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1dd50 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1dd60 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1dd70 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1dd80 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1dd90 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1dda0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1ddb0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1ddc0 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1ddd0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1dde0 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1ddf0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1de00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1de10 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1de20 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1de30 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1de40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1de50 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1de60 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1de70 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20  dr *pPg;..  pPg 
1de80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1de90 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1dea0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1deb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1dec0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1ded0 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1dee0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1def0 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1df00 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1df10 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1df20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1df30 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
1df40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1df50 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
1df60 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d  ager->pWal, pPg-
1df70 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b  >pgno, &iFrame);
1df80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1df90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1dfb0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1dfc0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1dfd0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1dfe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dff0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e000 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e010 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e020 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1e030 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e040 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1e050 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1e060 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1e070 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1e080 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1e090 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1e0a0 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1e0b0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e0c0 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1e0d0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1e0e0 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1e0f0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1e100 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1e110 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1e120 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1e130 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1e140 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1e150 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1e160 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1e170 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1e180 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1e190 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1e1a0 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1e1b0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1e1c0 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1e1d0 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1e1e0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1e1f0 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1e200 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1e210 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1e220 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1e230 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1e240 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1e250 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e260 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e270 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1e280 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1e290 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1e2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e2b0 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1e2c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1e2d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e2f0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1e300 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e320 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1e330 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1e340 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1e350 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1e360 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1e370 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1e380 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1e390 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1e3a0 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1e3b0 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1e3c0 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1e3d0 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1e3e0 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1e3f0 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1e400 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1e410 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1e420 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1e430 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1e440 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e450 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1e460 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1e470 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1e480 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1e490 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1e4a0 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1e4b0 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1e4c0 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1e4d0 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1e4e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e4f0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e500 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1e510 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1e520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e530 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1e540 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1e550 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1e560 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1e570 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1e580 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1e590 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1e5a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e5b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e5c0 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1e5d0 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1e5e0 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1e5f0 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1e600 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e610 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1e620 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1e630 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1e640 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1e650 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1e660 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1e670 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e680 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1e690 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1e6a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20  .**.** The list 
1e6b0 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20  of pages passed 
1e6c0 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
1e6d0 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74  e is always sort
1e6e0 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ed by page numbe
1e6f0 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20  r..** Hence, if 
1e700 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61  page 1 appears a
1e710 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  nywhere on the l
1e720 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ist, it will be 
1e730 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a  the first page..
1e740 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1e750 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1e760 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e790 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e7a0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1e7b0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e7c0 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1e7d0 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1e7e0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1e7f0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e800 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1e810 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1e820 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e840 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e850 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20   commit */.){.  
1e860 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e890 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e8c0 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20   pages in pList 
1e8d0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1e8e0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1e8f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1e900 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67  HECK_PAGES).  Pg
1e910 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e930 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e940 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  r pages */.#endi
1e950 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
1e960 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61  ger->pWal );.  a
1e970 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e990 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
1e9a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69  that the page li
1e9b0 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69  st is in accendi
1e9c0 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f  ng order */.  fo
1e9d0 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20  r(p=pList; p && 
1e9e0 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e  p->pDirty; p=p->
1e9f0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1ea00 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70  ert( p->pgno < p
1ea10 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29  ->pDirty->pgno )
1ea20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1ea30 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70  assert( pList->p
1ea40 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f  Dirty==0 || isCo
1ea50 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73  mmit );.  if( is
1ea60 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  Commit ){.    /*
1ea70 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61   If a WAL transa
1ea80 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1ea90 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20  ommitted, there 
1eaa0 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77  is no point in w
1eab0 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  riting.    ** an
1eac0 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  y pages with pag
1ead0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1eae0 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65  r than nTruncate
1eaf0 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69   into the WAL fi
1eb00 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20  le..    ** They 
1eb10 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65  will never be re
1eb20 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  ad by any client
1eb30 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d  . So remove them
1eb40 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79   from the pDirty
1eb50 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72  .    ** list her
1eb60 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20  e. */.    PgHdr 
1eb70 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a  *p;.    PgHdr **
1eb80 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
1eb90 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
1eba0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1ebb0 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d   (*ppNext = p)!=
1ebc0 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  0; p=p->pDirty){
1ebd0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1ebe0 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b  no<=nTruncate ){
1ebf0 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20  .        ppNext 
1ec00 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = &p->pDirty;.  
1ec10 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20        nList++;. 
1ec20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ec30 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1ec40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1ec50 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  List = 1;.  }.  
1ec60 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
1ec70 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20  GER_STAT_WRITE] 
1ec80 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28  += nList;..  if(
1ec90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1eca0 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
1ecb0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
1ecc0 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
1ecd0 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  e3WalFrames(pPag
1ece0 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20  er->pWal, .     
1ecf0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ed00 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63  e, pList, nTrunc
1ed10 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70  ate, isCommit, p
1ed20 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
1ed30 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1ed40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ed50 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1ed60 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1ed70 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1ed80 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1ed90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1eda0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1edb0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1edc0 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1edd0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1ede0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1edf0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1ee00 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1ee10 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1ee20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1ee30 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1ee40 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ee50 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1ee60 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1ee70 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1ee80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1ee90 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1eea0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1eeb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1eec0 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1eed0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1eee0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1eef0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1ef00 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1ef10 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1ef20 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1ef30 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1ef40 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1ef50 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1ef60 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1ef70 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1ef80 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1ef90 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1efa0 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1efb0 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1efc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1efd0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1efe0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1eff0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f000 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f020 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f030 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f050 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1f060 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1f070 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1f080 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1f090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f0a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f0b0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1f0c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f0d0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1f0e0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f0f0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1f100 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1f110 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1f120 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f130 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f140 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1f150 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1f160 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1f170 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1f180 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1f190 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1f1a0 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1f1b0 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1f1c0 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1f1d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1f1e0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f1f0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1f200 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f210 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1f220 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f230 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1f240 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1f250 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1f260 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1f270 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
1f280 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f290 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1f2a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f2b0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1f2c0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1f2d0 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1f2e0 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1f2f0 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1f300 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1f310 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f320 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1f330 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1f340 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1f350 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1f360 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1f370 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1f380 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1f390 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f3a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f3b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1f3c0 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1f3d0 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1f3e0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1f3f0 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1f400 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f410 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1f420 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1f430 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1f440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f450 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1f460 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f470 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1f480 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4a0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f4b0 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1f4c0 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1f4d0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1f4e0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1f4f0 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1f500 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1f510 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1f520 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1f530 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1f540 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1f550 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1f560 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f570 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1f580 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f590 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1f5a0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1f5b0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1f5c0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1f5d0 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1f5e0 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1f5f0 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1f600 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1f610 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f620 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f630 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f640 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f650 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
1f660 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1f670 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1f680 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1f690 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f6a0 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61  e was not availa
1f6b0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1f6c0 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a   sub-system,.  *
1f6d0 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62  * determine it b
1f6e0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
1f6f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f700 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69   file. If the si
1f710 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  ze.  ** of the d
1f720 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1f730 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d  not an integer m
1f740 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70  ultiple of the p
1f750 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72  age-size,.  ** r
1f760 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65  ound down to the
1f770 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45   nearest page. E
1f780 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20  xcept, any file 
1f790 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20  larger than 0.  
1f7a0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1f7b0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1f7c0 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  o contain at lea
1f7d0 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a  st one page..  *
1f7e0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1f7f0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1f800 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f810 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f820 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1f830 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1f840 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1f850 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1f860 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1f870 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1f880 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1f890 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1f8a0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1f8b0 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1f8c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f8d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1f8e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f8f0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1f900 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1f910 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1f920 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1f930 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1f940 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1f950 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1f960 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1f970 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1f980 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1f990 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1f9a0 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1f9b0 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1f9c0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1f9d0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1f9e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1f9f0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1fa00 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1fa10 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1fa20 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1fa30 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1fa40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fa50 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1fa60 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1fa70 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1fa80 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1fa90 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1faa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1fab0 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1fac0 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1fad0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fae0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1faf0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1fb00 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1fb10 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1fb20 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1fb30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1fb40 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1fb50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1fb60 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1fb70 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1fb80 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1fb90 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1fba0 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1fbb0 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1fbc0 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1fbd0 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1fbe0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1fbf0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1fc00 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1fc10 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1fc20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1fc30 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1fc40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1fc50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1fc60 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1fc70 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1fc80 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1fc90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1fca0 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1fcb0 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1fcc0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1fcd0 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1fce0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1fcf0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1fd00 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1fd10 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1fd20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1fd30 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1fd40 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1fd50 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1fd60 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1fd70 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1fd80 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1fd90 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1fda0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1fdb0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1fdc0 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1fdd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1fde0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1fdf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1fe00 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1fe10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1fe20 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1fe30 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
1fe40 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1fe50 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
1fe60 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
1fe70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1fe80 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
1fe90 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
1fea0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1feb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fec0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fed0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
1fee0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1fef0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1ff00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1ff10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
1ff20 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1ff30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ff40 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
1ff50 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1ff60 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
1ff70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1ff80 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
1ff90 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
1ffa0 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
1ffb0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1ffc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ffd0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1ffe0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1fff0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20000 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20010 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
20020 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
20030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
20050 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
20060 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
20070 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
20080 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20090 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
200a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
200b0 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
200c0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
200d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
200e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
200f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20100 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
20110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20120 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
20130 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
20140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20160 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
20170 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
20180 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
20190 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
201a0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
201b0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
201c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
201d0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
201e0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
201f0 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
20200 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
20210 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
20220 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
20230 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
20240 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
20250 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
20260 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
20270 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
20280 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
20290 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
202a0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
202b0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
202c0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
202d0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
202e0 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
202f0 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
20300 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
20310 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
20320 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20330 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20340 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
20350 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
20360 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
20370 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20380 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
20390 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
203a0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
203b0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
203c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
203d0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
203e0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
203f0 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
20400 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
20410 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20420 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
20430 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20440 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20450 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20460 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20470 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20480 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20490 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
204a0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
204b0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
204c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
204d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
204e0 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
204f0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20500 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
20510 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
20520 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
20530 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20540 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20550 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20560 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20570 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20580 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20590 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
205a0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
205b0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
205c0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
205d0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
205e0 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
205f0 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
20600 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
20610 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
20620 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
20630 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20640 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20650 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20660 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20670 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20680 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20690 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
206a0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
206b0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
206c0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
206d0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
206e0 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
206f0 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
20700 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
20710 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
20720 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
20730 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20740 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20750 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20760 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20770 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20780 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20790 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
207a0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
207b0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
207c0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
207d0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
207e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
207f0 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
20800 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
20810 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
20820 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20830 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20840 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20850 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20860 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20870 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20880 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20890 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
208a0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
208b0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
208c0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
208d0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
208e0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
208f0 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
20900 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
20910 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
20920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20930 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20940 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20950 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20960 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20970 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20980 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20990 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
209a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
209b0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
209c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
209d0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
209e0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
209f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
20a00 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
20a10 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
20a20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20a30 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20a40 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20a50 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20a60 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20a70 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20a80 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20a90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20aa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20ab0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
20ad0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
20ae0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
20af0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
20b00 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
20b10 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
20b20 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20b30 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20b40 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20b50 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20b60 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20b70 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20b80 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20b90 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20ba0 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20bb0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20bc0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20bd0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20be0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20bf0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20c00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20c10 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
20c20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20c30 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
20c40 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
20c50 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
20c60 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20c70 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20c80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20c90 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20ca0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20cb0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20cc0 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20cd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20ce0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20cf0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20d00 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20d10 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
20d20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20d30 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
20d40 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20d50 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
20d60 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
20d70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20d80 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
20d90 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20da0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20db0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20dc0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
20dd0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
20de0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
20df0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20e00 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
20e10 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
20e20 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
20e30 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
20e40 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
20e50 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
20e60 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
20e70 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
20e80 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
20e90 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
20ea0 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
20eb0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
20ec0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20ed0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
20ee0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20ef0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
20f00 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
20f10 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20f20 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
20f30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
20f40 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
20f50 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
20f60 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
20f70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
20f80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
20f90 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
20fa0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20fb0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20fc0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20fd0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20fe0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20ff0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21000 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21010 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
21020 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
21030 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
21040 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
21050 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
21060 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21070 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21080 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
21090 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
210a0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
210b0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
210c0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
210d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
210e0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
210f0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
21100 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
21110 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
21120 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
21130 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
21140 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
21150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21170 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
21180 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21190 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
211a0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
211b0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
211c0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
211d0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
211e0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
211f0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
21200 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
21210 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
21220 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
21230 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21240 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
21250 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
21260 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21270 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21280 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21290 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
212a0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
212b0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
212c0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
212d0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
212e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
212f0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
21300 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
21310 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
21320 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
21330 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
21340 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21350 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21360 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21370 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
21380 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
21390 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
213a0 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
213b0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
213c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
213d0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
213e0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
213f0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21400 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
21410 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21420 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21430 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21440 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21450 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21460 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21480 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21490 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
214a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
214b0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
214c0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
214d0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
214e0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
214f0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
21500 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
21510 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
21520 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21530 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21540 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21550 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21560 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21570 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21580 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21590 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
215a0 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
215b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
215c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
215d0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
215e0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
215f0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
21600 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21610 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
21620 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21640 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21650 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21660 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21670 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21680 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21690 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
216a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
216b0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
216c0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
216d0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
216e0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
216f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
21700 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21710 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21720 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
21730 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21750 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21760 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21770 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21780 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
217a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
217b0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
217c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
217d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
217e0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
217f0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
21800 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
21810 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
21820 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21830 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
21840 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21850 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
21860 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
21870 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
21880 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
21890 2f 2a 0a 2a 2a 20 53 65 74 20 50 61 67 65 72 2e  /*.** Set Pager.
218a0 6e 4d 61 70 4c 69 6d 69 74 2c 20 74 68 65 20 6d  nMapLimit, the m
218b0 61 78 69 6d 75 6d 20 70 65 72 6d 69 74 74 65 64  aximum permitted
218c0 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 2c 20 62   mapping size, b
218d0 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
218e0 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 6f 66  urrent values of
218f0 20 50 61 67 65 72 2e 6e 4d 61 70 43 66 67 4c 69   Pager.nMapCfgLi
21900 6d 69 74 20 61 6e 64 20 50 61 67 65 72 2e 70 61  mit and Pager.pa
21910 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
21920 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
21930 20 73 68 6f 75 6c 64 20 6e 6f 74 20 75 73 65 20   should not use 
21940 6d 6d 61 70 20 61 74 20 61 6c 6c 2c 20 73 65 74  mmap at all, set
21950 20 6e 4d 61 70 4c 69 6d 69 74 20 74 6f 20 7a 65   nMapLimit to ze
21960 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ro..*/.static vo
21970 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69  id pagerFixMapli
21980 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
21990 72 29 7b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  r){.  if( isOpen
219a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3d 3d 30 20  (pPager->fd)==0 
219b0 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 66  .   || pPager->f
219c0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
219d0 72 73 69 6f 6e 3c 33 20 0a 20 20 20 7c 7c 20 70  rsion<3 .   || p
219e0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
219f0 6f 64 73 2d 3e 78 4d 72 65 6d 61 70 3d 3d 30 20  ods->xMremap==0 
21a00 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  .   || pPager->t
21a10 65 6d 70 46 69 6c 65 20 0a 20 20 29 7b 0a 20 20  empFile .  ){.  
21a20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c 69    pPager->nMapLi
21a30 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  mit = 0;.  }else
21a40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61   if( pPager->nMa
21a50 70 43 66 67 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  pCfgLimit<0 ){. 
21a60 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c     pPager->nMapL
21a70 69 6d 69 74 20 3d 20 28 69 36 34 29 70 50 61 67  imit = (i64)pPag
21a80 65 72 2d 3e 6e 4d 61 70 43 66 67 4c 69 6d 69 74  er->nMapCfgLimit
21a90 20 2a 20 2d 31 30 32 34 3b 0a 20 20 7d 65 6c 73   * -1024;.  }els
21aa0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  e{.    pPager->n
21ab0 4d 61 70 4c 69 6d 69 74 20 3d 20 28 69 36 34 29  MapLimit = (i64)
21ac0 70 50 61 67 65 72 2d 3e 6e 4d 61 70 43 66 67 4c  pPager->nMapCfgL
21ad0 69 6d 69 74 20 2a 20 70 50 61 67 65 72 2d 3e 70  imit * pPager->p
21ae0 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a  ageSize;.  }.}..
21af0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
21b00 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
21b10 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70   any memory mapp
21b20 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20  ing made of the 
21b30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21b40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21b50 67 65 72 53 65 74 4d 6d 61 70 73 69 7a 65 28 50  gerSetMmapsize(P
21b60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21b70 74 20 6e 4d 61 70 29 7b 0a 20 20 70 50 61 67 65  t nMap){.  pPage
21b80 72 2d 3e 6e 4d 61 70 43 66 67 4c 69 6d 69 74 20  r->nMapCfgLimit 
21b90 3d 20 6e 4d 61 70 3b 0a 20 20 70 61 67 65 72 46  = nMap;.  pagerF
21ba0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
21bb0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
21bc0 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
21bd0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
21be0 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
21bf0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21c00 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
21c10 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
21c20 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
21c30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21c40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
21c50 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
21c60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
21c70 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
21c80 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
21c90 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
21ca0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
21cb0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
21cc0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
21cd0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
21ce0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
21cf0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
21d00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21d10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21d20 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21d30 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21d40 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21d50 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21d60 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21d70 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21d80 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
21d90 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21da0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
21db0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
21dc0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
21dd0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
21de0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
21df0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
21e00 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
21e10 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
21e20 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
21e30 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
21e40 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
21e50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21e60 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
21e70 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
21e80 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
21e90 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21ea0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
21eb0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
21ec0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
21ed0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
21ef0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
21f00 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
21f10 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
21f20 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
21f30 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
21f40 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
21f50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
21f60 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
21f70 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
21f80 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
21f90 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
21fa0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
21fb0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
21fc0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
21fd0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
21fe0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
21ff0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
22000 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
22010 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
22020 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
22030 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
22040 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
22050 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
22060 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
22070 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
22080 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22090 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
220a0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
220b0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
220c0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
220d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
220e0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
220f0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
22100 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
22110 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
22120 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
22130 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
22140 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
22150 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
22160 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
22170 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
22180 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
22190 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
221a0 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
221b0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
221c0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
221d0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
221e0 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
221f0 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
22200 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
22210 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
22220 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
22230 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
22240 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
22250 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
22260 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
22270 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
22280 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
22290 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
222a0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
222b0 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
222c0 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
222d0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
222e0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
222f0 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
22300 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
22310 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
22320 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
22330 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
22340 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
22350 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
22360 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
22370 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
22380 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
22390 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
223a0 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
223b0 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
223c0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
223d0 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
223e0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
223f0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
22400 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
22410 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
22420 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
22430 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
22440 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
22450 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
22460 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
22470 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
22480 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
22490 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
224a0 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
224b0 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
224c0 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
224d0 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
224e0 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
224f0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
22500 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22510 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22520 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
22530 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
22540 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
22550 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
22560 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
22570 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
22580 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72  tyLevel(.  Pager
22590 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
225a0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
225b0 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
225c0 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  l for */.  int l
225d0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
225e0 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
225f0 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
22600 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
22610 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c   */  .  int bFul
22620 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a  lFsync,       /*
22630 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
22640 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74  c */.  int bCkpt
22650 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20  FullFsync    /* 
22660 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
22670 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29  t_fullfsync */.)
22680 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  {.  assert( leve
22690 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
226a0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
226b0 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
226c0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
226d0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
226e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
226f0 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
22700 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22710 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50  ) ?1:0;.  if( pP
22720 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
22730 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22740 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
22750 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22760 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
22770 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63  e if( bFullFsync
22780 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22790 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
227a0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
227b0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
227c0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
227d0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
227e0 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c  lse if( bCkptFul
227f0 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  lFsync ){.    pP
22800 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22810 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22820 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22830 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22840 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22850 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
22860 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22870 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22880 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22890 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
228a0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
228b0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
228c0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
228d0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
228e0 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
228f0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22900 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
22910 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
22920 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
22930 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  IONS;.  }.}.#end
22940 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
22950 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
22960 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
22970 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
22980 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
22990 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
229a0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
229b0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
229c0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
229d0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
229e0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
229f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
22a00 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
22a10 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
22a20 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
22a30 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
22a40 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
22a50 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
22a60 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
22a70 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
22a80 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
22a90 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
22aa0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
22ab0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
22ac0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
22ad0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
22ae0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
22af0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
22b00 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
22b10 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
22b20 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
22b30 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
22b40 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22b50 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
22b60 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
22b70 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
22b80 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
22b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22ba0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
22bb0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
22bc0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22bd0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
22be0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
22bf0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
22c00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
22c10 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
22c20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22c30 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
22c40 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
22c50 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
22c60 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22c70 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
22c80 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
22c90 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
22ca0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
22cb0 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
22cc0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ce0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
22cf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22d00 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
22d10 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
22d20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
22d30 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
22d40 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
22d50 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
22d60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22d70 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
22d80 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
22d90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22da0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
22db0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
22dc0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
22dd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
22de0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
22df0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
22e00 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
22e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
22e20 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
22e30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
22e40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
22e50 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
22e60 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
22e70 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
22e80 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
22e90 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
22ea0 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
22eb0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
22ec0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
22ed0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
22ee0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
22ef0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
22f00 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
22f10 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
22f20 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
22f30 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
22f40 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
22f50 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
22f60 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
22f70 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
22f80 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
22f90 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
22fa0 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
22fb0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
22fc0 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
22fd0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
22fe0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
22ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
23000 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
23010 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
23020 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
23030 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
23040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23070 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
23080 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
23090 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
230a0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
230b0 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
230c0 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
230d0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
230e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
230f0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
23100 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
23110 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
23120 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
23130 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
23140 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
23150 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
23160 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
23170 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
23180 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
23190 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
231a0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
231b0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
231c0 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
231d0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
231e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
231f0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
23200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
23230 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
23240 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
23250 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
23260 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
23270 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
23280 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
23290 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
232a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
232b0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
232c0 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
232d0 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
232e0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
232f0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
23300 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
23310 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
23320 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
23330 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23340 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
23350 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
23360 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23370 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
23380 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
23390 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
233a0 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
233b0 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
233c0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
233d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
233e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
233f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
23400 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
23410 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
23420 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23430 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
23440 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
23450 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
23460 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
23470 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
23480 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
23490 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
234a0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
234b0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
234c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
234d0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
234e0 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
234f0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
23500 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
23510 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
23520 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
23530 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
23540 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
23550 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
23560 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
23570 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
23580 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
23590 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
235a0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
235b0 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
235c0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
235d0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
235e0 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
235f0 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
23600 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
23610 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
23620 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
23630 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
23640 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
23650 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
23660 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
23670 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
23680 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23690 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
236a0 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
236b0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
236c0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
236d0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
236e0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
236f0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
23700 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
23710 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23720 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23730 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
23740 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
23750 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
23760 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
23770 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
23780 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
23790 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
237a0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
237b0 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
237c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
237d0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
237e0 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
237f0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
23800 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
23810 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
23820 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
23830 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23840 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
23850 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
23860 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
23870 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
23880 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
23890 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
238a0 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
238b0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
238c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
238d0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
238e0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
238f0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
23900 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
23910 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
23920 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
23930 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
23940 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
23950 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
23960 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
23970 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
23980 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
23990 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
239a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
239b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
239c0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
239d0 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
239e0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
239f0 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
23a00 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
23a10 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
23a20 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
23a30 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
23a40 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
23a50 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
23a60 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
23a70 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
23a80 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
23a90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23aa0 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
23ab0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
23ac0 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
23ad0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
23ae0 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
23af0 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
23b00 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
23b10 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
23b20 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
23b30 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
23b40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
23b50 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
23b60 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
23b70 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
23b80 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
23b90 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
23ba0 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
23bb0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
23bc0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
23bd0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
23be0 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
23bf0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
23c00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
23c10 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
23c20 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
23c30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
23c40 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
23c50 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
23c60 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
23c70 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
23c80 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
23c90 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
23ca0 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
23cb0 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
23cc0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
23cd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
23ce0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
23cf0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23d00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23d10 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
23d20 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
23d30 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
23d40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23d50 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
23d60 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
23d70 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
23d80 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
23d90 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
23da0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23db0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
23dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23dd0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
23de0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
23df0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
23e00 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
23e10 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
23e20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23e30 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
23e40 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
23e50 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
23e60 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
23e70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
23e80 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
23e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
23ea0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
23eb0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
23ec0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
23ed0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
23ee0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
23ef0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
23f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23f10 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
23f20 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
23f30 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
23f40 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
23f50 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
23f60 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
23f70 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
23f80 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
23f90 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
23fa0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
23fb0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
23fc0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
23fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23fe0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23ff0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
24000 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
24010 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
24020 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
24030 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
24040 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
24050 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
24060 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
24070 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
24080 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
24090 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
240a0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
240b0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
240c0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
240d0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
240e0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
240f0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
24100 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
24110 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
24120 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
24130 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
24140 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
24150 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
24160 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
24170 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
24180 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
24190 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
241a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
241b0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
241c0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
241d0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
241e0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
241f0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
24200 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
24210 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
24220 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
24230 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
24240 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
24250 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
24260 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24270 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
24280 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
24290 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
242a0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
242b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
242c0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
242d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
242e0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
242f0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
24300 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
24310 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
24320 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24330 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24340 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
24350 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
24360 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
24370 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24380 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
24390 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
243a0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
243b0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
243c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
243d0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
243e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
243f0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
24400 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
24410 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
24420 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
24430 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
24440 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24450 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
24460 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
24470 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
24480 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
24490 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
244a0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
244b0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
244c0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
244d0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
244e0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
244f0 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
24500 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
24510 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
24520 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24530 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24540 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
24550 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
24560 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
24570 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24580 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24590 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
245a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
245b0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
245c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
245d0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
245e0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
245f0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24600 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
24610 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
24620 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
24630 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
24640 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24650 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
24660 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
24670 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24680 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
24690 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
246a0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
246b0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
246c0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
246d0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
246e0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
246f0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24700 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
24710 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
24720 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
24730 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
24740 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
24750 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
24760 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
24770 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
24780 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24790 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
247a0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
247b0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
247c0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
247d0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
247e0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
247f0 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
24800 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
24810 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
24820 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
24830 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
24840 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
24850 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
24860 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
24870 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
24880 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
24890 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
248a0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
248b0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
248c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
248d0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
248e0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
248f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24900 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
24910 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24920 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
24930 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
24940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24950 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
24960 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
24970 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
24980 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
24990 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
249a0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
249b0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
249c0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
249d0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
249e0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
249f0 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
24a00 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
24a10 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
24a20 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
24a30 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
24a40 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24a50 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
24a60 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
24a70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24a80 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
24a90 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
24aa0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
24ab0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
24ac0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
24ad0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
24ae0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24af0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
24b00 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
24b10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24b20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24b30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24b40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
24b50 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
24b60 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
24b70 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
24b80 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
24b90 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
24ba0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
24bb0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
24bc0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
24bd0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
24be0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
24bf0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
24c00 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
24c10 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
24c20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
24c30 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
24c40 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
24c50 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
24c60 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
24c70 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
24c80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
24c90 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
24ca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24cb0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
24cc0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
24cd0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
24ce0 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
24cf0 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
24d00 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
24d10 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
24d20 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
24d30 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
24d40 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
24d50 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
24d60 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
24d70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
24d80 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
24d90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
24da0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
24db0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
24dc0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
24dd0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
24de0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
24df0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
24e00 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
24e10 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
24e20 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
24e30 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
24e40 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
24e50 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
24e60 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
24e70 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
24e80 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
24e90 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
24ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
24eb0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
24ec0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
24ed0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
24ee0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
24ef0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
24f00 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
24f10 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
24f20 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
24f30 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
24f40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
24f50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24f60 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
24f70 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
24f80 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
24f90 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24fc0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
24fd0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
24fe0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
24ff0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
25000 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
25010 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
25020 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
25030 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
25040 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
25050 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
25060 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
25070 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
25080 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
25090 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
250a0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
250b0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
250c0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
250d0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
250e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
250f0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
25100 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
25110 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
25120 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25130 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
25140 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
25150 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
25160 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
25170 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
25180 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
25190 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
251a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
251b0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
251c0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
251d0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
251e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
251f0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
25200 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25210 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25220 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
25230 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
25240 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
25250 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
25260 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
25270 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
25280 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
25290 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
252a0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
252b0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
252c0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
252d0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
252e0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
252f0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
25300 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
25310 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
25320 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
25330 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
25340 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
25350 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25360 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
25370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
25380 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
25390 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
253a0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
253b0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
253c0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
253d0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
253e0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
253f0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
25400 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
25410 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
25420 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
25430 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
25440 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
25450 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
25460 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
25470 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
25480 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
25490 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
254a0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
254b0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
254c0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
254d0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
254e0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
254f0 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20 77  rect behaviour w
25500 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
25510 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
25520 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
25530 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
25540 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
25550 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
25560 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
25570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25580 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
25590 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
255a0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
255b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
255c0 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
255d0 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
255e0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
255f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
25600 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
25610 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
25620 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
25630 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
25640 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
25650 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
25660 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
25670 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
25680 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
25690 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
256a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
256b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
256c0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
256d0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
256e0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
256f0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
25700 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
25710 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
25720 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
25730 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
25740 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25750 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
25760 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
25770 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
25780 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25790 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
257a0 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
257b0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
257c0 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
257d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
257e0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
257f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
25800 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
25810 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
25820 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
25830 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
25840 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25850 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
25860 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
25870 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
25880 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
25890 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
258a0 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
258b0 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
258c0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
258d0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
258e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
258f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
25900 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
25910 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
25920 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
25930 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
25940 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
25950 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
25960 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
25970 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
25980 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
25990 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
259a0 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
259b0 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
259c0 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
259d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
259e0 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
259f0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
25a00 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
25a10 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
25a20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
25a30 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
25a40 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
25a50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
25a60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
25a70 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
25a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
25a90 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
25aa0 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
25ab0 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
25ac0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25ad0 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
25ae0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
25af0 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
25b00 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
25b10 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
25b20 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
25b30 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
25b40 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
25b50 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
25b60 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
25b70 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
25b80 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
25b90 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
25ba0 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
25bb0 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
25bc0 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
25bd0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
25be0 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
25bf0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
25c00 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
25c10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
25c20 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
25c30 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
25c40 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
25c50 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
25c60 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
25c70 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
25c80 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
25c90 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
25ca0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25cb0 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
25cc0 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
25cd0 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
25ce0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
25cf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
25d00 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
25d10 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
25d20 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
25d30 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
25d40 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
25d50 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
25d60 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
25d70 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
25d80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25d90 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
25da0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
25db0 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
25dc0 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
25dd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
25de0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
25df0 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
25e00 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
25e10 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
25e20 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
25e30 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
25e40 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
25e50 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
25e60 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
25e70 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
25e80 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
25e90 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
25ea0 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
25eb0 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
25ec0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
25ed0 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
25ee0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
25ef0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
25f00 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
25f10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
25f20 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
25f30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25f40 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
25f50 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
25f60 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
25f70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
25f80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25f90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
25fa0 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
25fb0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
25fc0 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
25fd0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
25fe0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
25ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26000 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
26010 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
26020 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
26030 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
26040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26050 2a 2a 20 55 6e 6d 61 70 20 61 6e 79 20 6d 65 6d  ** Unmap any mem
26060 6f 72 79 20 6d 61 70 70 69 6e 67 20 6f 66 20 74  ory mapping of t
26070 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26090 70 61 67 65 72 55 6e 6d 61 70 28 50 61 67 65 72  pagerUnmap(Pager
260a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
260b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  ert( pPager->nMm
260c0 61 70 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66  apOut==0 );.  if
260d0 28 20 70 50 61 67 65 72 2d 3e 70 4d 61 70 20 29  ( pPager->pMap )
260e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4d  {.    sqlite3OsM
260f0 72 65 6d 61 70 28 70 50 61 67 65 72 2d 3e 66 64  remap(pPager->fd
26100 2c 20 30 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  , 0, 0, pPager->
26110 6e 4d 61 70 2c 20 30 2c 20 26 70 50 61 67 65 72  nMap, 0, &pPager
26120 2d 3e 70 4d 61 70 29 3b 0a 20 20 20 20 70 50 61  ->pMap);.    pPa
26130 67 65 72 2d 3e 6e 4d 61 70 20 3d 20 30 3b 0a 20  ger->nMap = 0;. 
26140 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 56     pPager->nMapV
26150 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  alid = 0;.  }.  
26160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
26180 65 2c 20 6f 72 20 72 65 63 72 65 61 74 65 2c 20  e, or recreate, 
26190 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
261a0 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
261b0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
261c0 69 63 20 69 6e 74 20 70 61 67 65 72 4d 61 70 28  ic int pagerMap(
261d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
261e0 6e 74 20 62 45 78 74 65 6e 64 29 7b 0a 20 20 69  nt bExtend){.  i
261f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26200 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
26210 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26220 0a 20 20 50 67 6e 6f 20 6e 50 67 3b 20 20 20 20  .  Pgno nPg;    
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
26250 70 70 69 6e 67 20 74 6f 20 72 65 71 75 65 73 74  pping to request
26260 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
26270 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  64 sz;          
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26290 2a 20 53 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e  * Size of mappin
262a0 67 20 74 6f 20 72 65 71 75 65 73 74 20 69 6e 20  g to request in 
262b0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
262c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
262d0 72 2d 3e 66 64 29 20 26 26 20 70 50 61 67 65 72  r->fd) && pPager
262e0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b  ->tempFile==0 );
262f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26300 72 2d 3e 70 4d 61 70 3d 3d 30 20 7c 7c 20 70 50  r->pMap==0 || pP
26310 61 67 65 72 2d 3e 6e 4d 61 70 3e 30 20 29 3b 0a  ager->nMap>0 );.
26320 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61    /* assert( pPa
26330 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 31 20 29  ger->eState>=1 )
26340 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
26350 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d  Pager->nMmapOut=
26360 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
26370 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c 69 6d 69  pPager->nMapLimi
26380 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  t>0 );..  /* Fig
26390 75 72 65 20 6f 75 74 20 68 6f 77 20 6c 61 72 67  ure out how larg
263a0 65 20 61 20 6d 61 70 70 69 6e 67 20 74 6f 20 72  e a mapping to r
263b0 65 71 75 65 73 74 2e 20 53 65 74 20 76 61 72 69  equest. Set vari
263c0 61 62 6c 65 20 73 7a 20 74 6f 20 74 68 69 73 20  able sz to this 
263d0 0a 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 62  .  ** value in b
263e0 79 74 65 73 2e 20 2a 2f 0a 20 20 6e 50 67 20 3d  ytes. */.  nPg =
263f0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
26400 3d 3d 31 29 20 3f 20 70 50 61 67 65 72 2d 3e 64  ==1) ? pPager->d
26410 62 53 69 7a 65 20 3a 20 70 50 61 67 65 72 2d 3e  bSize : pPager->
26420 64 62 46 69 6c 65 53 69 7a 65 3b 0a 20 20 73 7a  dbFileSize;.  sz
26430 20 3d 20 28 69 36 34 29 6e 50 67 20 2a 20 70 50   = (i64)nPg * pP
26440 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
26450 20 20 69 66 28 20 73 7a 3e 70 50 61 67 65 72 2d    if( sz>pPager-
26460 3e 6e 4d 61 70 4c 69 6d 69 74 20 29 20 73 7a 20  >nMapLimit ) sz 
26470 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c 69  = pPager->nMapLi
26480 6d 69 74 3b 0a 0a 20 20 69 66 28 20 73 7a 21 3d  mit;..  if( sz!=
26490 70 50 61 67 65 72 2d 3e 6e 4d 61 70 56 61 6c 69  pPager->nMapVali
264a0 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  d ){.    int fla
264b0 67 73 20 3d 20 28 62 45 78 74 65 6e 64 20 3f 20  gs = (bExtend ? 
264c0 53 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 45 58  SQLITE_MREMAP_EX
264d0 54 45 4e 44 20 3a 20 30 29 3b 0a 20 20 20 20 72  TEND : 0);.    r
264e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4d 72 65  c = sqlite3OsMre
264f0 6d 61 70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  map(pPager->fd, 
26500 66 6c 61 67 73 2c 20 30 2c 20 70 50 61 67 65 72  flags, 0, pPager
26510 2d 3e 6e 4d 61 70 2c 20 73 7a 2c 20 26 70 50 61  ->nMap, sz, &pPa
26520 67 65 72 2d 3e 70 4d 61 70 29 3b 0a 20 20 20 20  ger->pMap);.    
26530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26540 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
26550 74 28 20 70 50 61 67 65 72 2d 3e 70 4d 61 70 21  t( pPager->pMap!
26560 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  =0 );.      pPag
26570 65 72 2d 3e 6e 4d 61 70 20 3d 20 73 7a 3b 0a 20  er->nMap = sz;. 
26580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26590 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
265a0 70 4d 61 70 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pMap==0 );.     
265b0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 20 3d 20   pPager->nMap = 
265c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
265d0 67 65 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 20 3d  ger->nMapValid =
265e0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 3b 0a 20   pPager->nMap;. 
265f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 62 4d 61   }.  pPager->bMa
26600 70 52 65 73 69 7a 65 20 3d 20 30 3b 0a 0a 20 20  pResize = 0;..  
26610 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26620 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66  .** Obtain a ref
26630 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f  erence to a memo
26640 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f  ry mapped page o
26650 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e  bject for page n
26660 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20  umber pgno. .** 
26670 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
26680 65 6e 73 75 72 65 20 74 68 61 74 20 70 61 67 65  ensure that page
26690 20 70 67 6e 6f 20 6c 69 65 73 20 77 69 74 68 69   pgno lies withi
266a0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
266b0 6d 61 70 70 65 64 20 0a 2a 2a 20 72 65 67 69 6f  mapped .** regio
266c0 6e 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  n. If successful
266d0 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f  , set *ppPage to
266e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
266f0 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  w page reference
26700 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53  .** and return S
26710 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
26720 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  ise, return an S
26730 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
26740 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50   and set.** *ppP
26750 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  age to zero..**.
26760 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e 63  ** Page referenc
26770 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63  es obtained by c
26780 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
26790 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72  tion should be r
267a0 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61  eleased.** by ca
267b0 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61  lling pagerRelea
267c0 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  seMapPage()..*/.
267d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
267e0 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 50  AcquireMapPage(P
267f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
26800 6e 6f 20 70 67 6e 6f 2c 20 50 67 48 64 72 20 2a  no pgno, PgHdr *
26810 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
26820 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
26830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26840 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26850 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
26860 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 46    if( pPager->pF
26870 72 65 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  ree ){.    *ppPa
26880 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d  ge = p = pPager-
26890 3e 70 46 72 65 65 3b 0a 20 20 20 20 70 50 61 67  >pFree;.    pPag
268a0 65 72 2d 3e 70 46 72 65 65 20 3d 20 70 2d 3e 70  er->pFree = p->p
268b0 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
268c0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 6d 65  irty = 0;.    me
268d0 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20  mset(p->pExtra, 
268e0 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
268f0 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  a);.  }else{.   
26900 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 28   *ppPage = p = (
26910 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65 33 4d  PgHdr *)sqlite3M
26920 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
26930 28 50 67 48 64 72 29 20 2b 20 70 50 61 67 65 72  (PgHdr) + pPager
26940 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 69  ->nExtra);.    i
26950 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( p==0 ){.     
26960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26970 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
26980 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69  p->pExtra = (voi
26990 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  d *)&p[1];.    p
269a0 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f  ->flags = PGHDR_
269b0 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  MMAP;.    p->nRe
269c0 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50  f = 1;.    p->pP
269d0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
269e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
269f0 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a  >pExtra==(void *
26a00 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65  )&p[1] );.  asse
26a10 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20  rt( p->pPage==0 
26a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26a30 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41  flags==PGHDR_MMA
26a40 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  P );.  assert( p
26a50 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
26a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26a70 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70  >nRef==1 );..  p
26a80 2d 3e 70 44 61 74 61 20 3d 20 26 28 28 75 38 20  ->pData = &((u8 
26a90 2a 29 70 50 61 67 65 72 2d 3e 70 4d 61 70 29 5b  *)pPager->pMap)[
26aa0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
26ab0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26ac0 5d 3b 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ];.  p->pgno = p
26ad0 67 6e 6f 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  gno;.  pPager->n
26ae0 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65  MmapOut++;..  re
26af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26b00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
26b10 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26b20 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75  page pPg. pPg mu
26b30 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74  st have been ret
26b40 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20  urned by an .** 
26b50 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
26b60 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26b70 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
26b80 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61   void pagerRelea
26b90 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20  seMapPage(PgHdr 
26ba0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
26bb0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
26bc0 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ager;.  pPager->
26bd0 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50  nMmapOut--;.  pP
26be0 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
26bf0 65 72 2d 3e 70 46 72 65 65 3b 0a 20 20 70 50 61  er->pFree;.  pPa
26c00 67 65 72 2d 3e 70 46 72 65 65 20 3d 20 70 50 67  ger->pFree = pPg
26c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
26c20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74  all PgHdr object
26c30 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
26c40 50 61 67 65 72 2e 70 46 72 65 65 20 6c 69 73 74  Pager.pFree list
26c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26c60 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
26c70 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
26c80 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
26c90 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20  PgHdr *pNext;.  
26ca0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 46  for(p=pPager->pF
26cb0 72 65 65 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  ree; p; p=pNext)
26cc0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
26cd0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c  >pDirty;.    sql
26ce0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
26cf0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  }.}.../*.** Shut
26d00 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
26d10 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
26d20 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
26d30 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
26d40 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26d50 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
26d60 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
26d70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
26d80 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
26d90 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
26da0 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
26db0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
26dc0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
26dd0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
26de0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
26df0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
26e00 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
26e10 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
26e20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
26e30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26e40 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
26e50 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
26e60 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
26e70 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
26e80 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
26e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
26ea0 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
26eb0 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
26ec0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
26ed0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
26ee0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
26ef0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
26f00 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
26f10 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
26f20 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
26f30 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
26f40 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
26f50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26f60 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
26f70 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70  pPager){.  u8 *p
26f80 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67  Tmp = (u8 *)pPag
26f90 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  er->pTmpSpace;..
26fa0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
26fb0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
26fc0 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
26fd0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
26fe0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
26ff0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
27000 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 55 6e  loc();.  pagerUn
27010 6d 61 70 28 70 50 61 67 65 72 29 3b 0a 20 20 70  map(pPager);.  p
27020 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27030 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
27040 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27050 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
27060 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
27070 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
27080 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
27090 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
270a0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
270b0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
270c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
270d0 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
270e0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
270f0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
27100 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
27110 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27120 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
27130 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
27140 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
27150 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
27160 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
27170 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
27180 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
27190 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
271a0 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
271b0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
271c0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
271d0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
271e0 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
271f0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
27200 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
27210 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
27220 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
27230 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
27240 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
27250 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
27260 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
27270 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
27280 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
27290 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
272a0 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
272b0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
272c0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
272d0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
272e0 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
272f0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
27300 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
27310 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
27320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
27330 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
27340 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
27350 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
27360 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
27370 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
27380 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
27390 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
273a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
273b0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
273c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
273d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
273e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
273f0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
27400 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
27410 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
27420 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
27430 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
27440 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
27450 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
27460 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27470 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
27480 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
27490 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
274a0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
274b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
274c0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
274d0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
274e0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
274f0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27500 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
27510 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27520 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
27530 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
27540 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
27550 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
27560 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27570 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
27580 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
27590 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
275a0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
275b0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
275c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
275d0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
275e0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
275f0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
27600 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
27610 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
27620 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27630 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27640 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
27650 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27660 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27670 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
27680 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
27690 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
276a0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
276b0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
276c0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
276d0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
276e0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
276f0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27700 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27710 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
27720 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27730 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27740 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27750 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27760 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27770 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27780 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27790 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
277a0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
277b0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
277c0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
277d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
277e0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
277f0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27800 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
27810 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
27820 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27830 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27840 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27850 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27860 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27870 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27890 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
278a0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
278b0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
278c0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
278d0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
278e0 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
278f0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
27900 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
27910 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27920 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
27930 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
27940 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
27950 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
27960 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27970 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27980 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27990 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
279a0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
279b0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
279c0 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
279d0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
279e0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
279f0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
27a00 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
27a10 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
27a20 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
27a30 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
27a40 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
27a50 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
27a60 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27a70 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27a80 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27a90 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
27aa0 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27ac0 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
27ad0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
27ae0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
27af0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
27b00 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27b10 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
27b20 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
27b30 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
27b40 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
27b50 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
27b60 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27b70 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27b80 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27b90 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27ba0 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27bb0 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27bc0 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27bd0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27be0 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
27bf0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
27c00 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
27c10 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
27c20 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
27c30 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
27c40 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
27c50 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
27c60 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
27c70 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27c80 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
27c90 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
27ca0 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27cb0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27cc0 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
27cd0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
27ce0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
27cf0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
27d00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27d10 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
27d20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
27d30 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
27d40 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
27d50 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27d80 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
27d90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27da0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27db0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27dc0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
27dd0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27de0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
27df0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
27e00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
27e10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27e20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
27e30 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
27e40 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
27e50 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
27e60 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27e70 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27e80 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
27e90 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
27ea0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27eb0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
27ec0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27ed0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27ef0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27f00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
27f10 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
27f20 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
27f30 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
27f40 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
27f50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27f60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27f70 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
27f80 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
27f90 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
27fa0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
27fb0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
27fc0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
27fd0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
27fe0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
27ff0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
28000 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
28010 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
28020 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
28030 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
28040 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
28050 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28060 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
28070 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
28080 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
28090 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
280a0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
280b0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
280c0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
280d0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
280e0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
280f0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
28100 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
28110 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
28120 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
28130 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
28140 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
28150 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
28160 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
28170 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
28180 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
28190 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
281a0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
281b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
281c0 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
281d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
281e0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
281f0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
28200 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
28210 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
28220 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
28230 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
28240 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
28250 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28260 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
28270 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
28280 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
28290 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
282a0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
282b0 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
282c0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
282d0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
282e0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
282f0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
28300 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
28310 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
28320 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
28330 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
28340 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
28350 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
28360 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
28370 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
28380 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
28390 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
283a0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
283b0 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
283c0 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
283d0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
283e0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
283f0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
28400 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28410 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
28420 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
28430 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
28440 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
28450 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
28460 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28470 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
28480 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
28490 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
284a0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
284b0 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
284c0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
284d0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
284e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
284f0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
28500 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
28510 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
28520 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
28530 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
28540 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
28550 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
28560 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28570 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
28580 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
28590 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
285a0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
285b0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
285c0 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
285d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
285e0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
285f0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
28600 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
28610 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
28620 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28640 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
28650 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
28660 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28680 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
28690 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
286a0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
286b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
286c0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
286d0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
286e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
286f0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28700 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
28710 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
28720 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28730 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28740 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28750 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28760 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28770 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28780 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28790 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
287a0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
287b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
287c0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
287d0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
287e0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
287f0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28800 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
28810 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
28820 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28830 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28840 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28850 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28860 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28870 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28880 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28890 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
288a0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
288b0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
288c0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
288d0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
288e0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
288f0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
28900 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
28910 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
28920 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
28930 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
28940 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
28950 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
28960 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28970 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28980 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28990 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
289a0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
289b0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
289c0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
289d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
289e0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
289f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28a00 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
28a10 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28a20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28a30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
28a40 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
28a50 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28a60 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28a70 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28a80 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28a90 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28aa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28ab0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28ac0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28ad0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
28ae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28af0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28b00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28b10 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28b20 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
28b30 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
28b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
28b50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28b60 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28b70 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28b80 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28b90 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28ba0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28bb0 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28bc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28be0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28bf0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
28c00 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
28c10 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
28c20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28c30 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
28c40 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28c50 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28c60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28c70 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28c80 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
28c90 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28ca0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28cb0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28cc0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
28cd0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
28ce0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
28cf0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
28d00 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
28d10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28d30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28d40 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
28d50 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28d70 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
28d80 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
28d90 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
28da0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28db0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
28dc0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
28dd0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
28de0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28e00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28e20 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
28e30 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28e40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28e50 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
28e60 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
28e70 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
28e80 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
28e90 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
28ea0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
28eb0 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
28ec0 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
28ed0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28ee0 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
28ef0 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
28f00 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
28f10 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
28f20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
28f30 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
28f40 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
28f50 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
28f60 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28f70 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28f90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
28fa0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
28fb0 65 20 77 61 6c 2e 63 20 6d 6f 64 75 6c 65 20 61  e wal.c module a
28fc0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
28fd0 20 63 68 65 63 6b 70 6f 69 6e 74 2e 20 49 66 20   checkpoint. If 
28fe0 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  the.** checkpoin
28ff0 74 20 72 75 6e 73 20 74 6f 20 63 6f 6d 70 6c 65  t runs to comple
29000 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 73 65  tion, it will se
29010 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
29020 69 6c 65 20 73 69 7a 65 20 74 6f 0a 2a 2a 20 73  ile size to.** s
29030 7a 52 65 71 20 62 79 74 65 73 2e 20 54 68 69 73  zReq bytes. This
29040 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
29050 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a  ms two tasks:.**
29060 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 66  .**   * If the f
29070 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
29080 20 6c 65 73 73 20 74 68 61 6e 20 73 7a 52 65 71   less than szReq
29090 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
290a0 61 6e 0a 2a 2a 20 20 20 20 20 78 46 69 6c 65 43  an.**     xFileC
290b0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 46 4e  ontrol(SQLITE_FN
290c0 43 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 69  CTL_SIZE_HINT) i
290d0 73 20 69 73 73 75 65 64 20 74 6f 20 69 6e 66 6f  s issued to info
290e0 72 6d 20 74 68 65 20 4f 53 0a 2a 2a 20 20 20 20  rm the OS.**    
290f0 20 6c 61 79 65 72 20 6f 66 20 74 68 65 20 65 78   layer of the ex
29100 70 65 63 74 65 64 20 66 69 6c 65 20 73 69 7a 65  pected file size
29110 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
29120 49 66 20 6d 6d 61 70 20 69 73 20 62 65 69 6e 67  If mmap is being
29130 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
29140 6d 61 70 70 69 6e 67 20 69 73 20 65 78 74 65 6e  mapping is exten
29150 64 65 64 20 74 6f 20 73 7a 52 65 71 0a 2a 2a 20  ded to szReq.** 
29160 20 20 20 20 62 79 74 65 73 20 69 6e 20 73 69 7a      bytes in siz
29170 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
29180 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
29190 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
291a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
291b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
291c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
291d0 33 50 61 67 65 72 53 65 74 46 69 6c 65 73 69 7a  3PagerSetFilesiz
291e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
291f0 20 69 36 34 20 73 7a 52 65 71 29 7b 0a 20 20 69   i64 szReq){.  i
29200 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 73 7a 3b  nt rc;.  i64 sz;
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
29230 20 6f 66 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   of file on disk
29240 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
29250 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29260 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
29270 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
29280 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
29290 3d 3d 30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ==0 );..  rc = s
292a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
292b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 73 7a  (pPager->fd, &sz
292c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
292d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
292e0 28 20 73 7a 3e 73 7a 52 65 71 20 29 7b 0a 20 20  ( sz>szReq ){.  
292f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
29300 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
29310 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
29320 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
29330 20 26 73 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &sz);.    }.  }
29340 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
29350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 36  ITE_OK ){.    i6
29360 34 20 73 7a 4d 61 70 20 3d 20 28 73 7a 52 65 71  4 szMap = (szReq
29370 20 3e 20 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c   > pPager->nMapL
29380 69 6d 69 74 29 20 3f 20 70 50 61 67 65 72 2d 3e  imit) ? pPager->
29390 6e 4d 61 70 4c 69 6d 69 74 20 3a 20 73 7a 52 65  nMapLimit : szRe
293a0 71 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  q;.    if( pPage
293b0 72 2d 3e 6e 4d 61 70 56 61 6c 69 64 21 3d 70 50  r->nMapValid!=pP
293c0 61 67 65 72 2d 3e 6e 4d 61 70 20 7c 7c 20 73 7a  ager->nMap || sz
293d0 4d 61 70 21 3d 70 50 61 67 65 72 2d 3e 6e 4d 61  Map!=pPager->nMa
293e0 70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  p ){.      pPage
293f0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
29400 28 73 7a 52 65 71 20 2f 20 70 50 61 67 65 72 2d  (szReq / pPager-
29410 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
29420 20 20 72 63 20 3d 20 70 61 67 65 72 4d 61 70 28    rc = pagerMap(
29430 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
29440 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
29450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
29460 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
29470 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
29480 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
29490 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
294a0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
294b0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
294c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
294d0 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
294e0 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
294f0 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
29500 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
29510 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
29520 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
29530 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
29540 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
29550 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
29560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29570 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
29580 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
29590 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
295a0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
295b0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
295c0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
295d0 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
295e0 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
295f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
29600 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
29610 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
29620 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
29630 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
29640 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
29650 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
29660 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
29670 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
29680 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29690 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
296a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
296b0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
296c0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
296d0 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
296e0 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
296f0 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
29700 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
29710 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
29720 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
29730 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
29740 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
29750 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
29760 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
29770 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
29780 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
29790 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
297a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
297b0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
297c0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
297d0 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
297e0 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
297f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
29800 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
29810 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
29820 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
29830 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
29840 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
29850 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29860 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
29870 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
29880 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
29890 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
298a0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
298b0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
298c0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
298d0 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
298e0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
298f0 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
29900 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
29910 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
29920 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
29930 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
29940 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
29950 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
29960 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
29970 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
29980 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
29990 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
299a0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
299b0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
299c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
299d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
299e0 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
299f0 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
29a00 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
29a10 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
29a20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
29a30 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
29a40 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
29a50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
29a60 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
29a70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29aa0 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
29ab0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
29ac0 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
29ad0 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
29ae0 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
29af0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
29b00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
29b10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29b20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
29b30 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
29b40 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
29b50 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
29b60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
29b70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
29b80 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
29b90 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
29ba0 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
29bb0 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
29bc0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
29bd0 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
29be0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29bf0 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
29c00 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
29c10 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
29c20 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
29c30 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
29c40 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
29c50 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29c60 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
29c70 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
29c80 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
29c90 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
29ca0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
29cb0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
29cc0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
29cd0 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
29ce0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
29cf0 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
29d00 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
29d10 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
29d20 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
29d30 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
29d40 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
29d50 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
29d60 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
29d70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
29d80 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
29d90 72 74 79 20 3f 20 70 50 61 67 65 72 2d 3e 64 62  rty ? pPager->db
29da0 53 69 7a 65 20 3a 20 70 4c 69 73 74 2d 3e 70 67  Size : pList->pg
29db0 6e 6f 2b 31 29 3e 70 50 61 67 65 72 2d 3e 64 62  no+1)>pPager->db
29dc0 48 69 6e 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20  HintSize .  ){. 
29dd0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
29de0 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
29df0 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
29e00 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
29e10 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
29e20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
29e30 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
29e40 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
29e50 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
29e60 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
29e70 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
29e80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
29e90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
29ea0 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20  >nMmapOut==0 && 
29eb0 70 50 61 67 65 72 2d 3e 6e 4d 61 70 4c 69 6d 69  pPager->nMapLimi
29ec0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  t>0 ){.      pPa
29ed0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
29ee0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
29ef0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
29f00 65 72 4d 61 70 28 70 50 61 67 65 72 2c 20 31 29  erMap(pPager, 1)
29f10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
29f20 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29f30 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
29f40 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
29f50 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
29f60 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
29f70 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
29f80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
29f90 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
29fa0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
29fb0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
29fc0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
29fd0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
29fe0 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
29ff0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
2a000 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
2a010 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
2a020 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
2a030 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
2a040 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
2a050 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
2a060 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
2a070 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
2a080 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
2a090 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
2a0a0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
2a0b0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
2a0c0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
2a0d0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2a0e0 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
2a0f0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
2a100 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
2a110 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2a120 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
2a130 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
2a140 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
2a150 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
2a160 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
2a170 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
2a180 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
2a1c0 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
2a1d0 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
2a1e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2a1f0 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2a200 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2a210 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
2a220 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
2a230 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
2a240 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
2a250 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
2a260 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2a270 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
2a280 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
2a290 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
2a2a0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
2a2b0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
2a2c0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
2a2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a2e0 67 65 72 57 72 69 74 65 44 61 74 61 28 70 50 61  gerWriteData(pPa
2a2f0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 61 67  ger, pData, pPag
2a300 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2a310 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
2a320 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
2a330 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
2a340 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
2a350 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
2a360 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
2a370 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
2a380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a390 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
2a3a0 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
2a3b0 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
2a3c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
2a3d0 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
2a3e0 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
2a3f0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
2a400 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
2a410 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
2a420 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
2a430 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
2a440 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
2a450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a460 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
2a470 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
2a480 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
2a490 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
2a4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a4b0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
2a4c0 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b  GER_STAT_WRITE]+
2a4d0 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  +;..      /* Upd
2a4e0 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
2a4f0 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
2a500 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2a510 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
2a520 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
2a530 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
2a540 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
2a550 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
2a560 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
2a570 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
2a580 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
2a590 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
2a5a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2a5b0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
2a5c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2a5d0 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
2a5e0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
2a5f0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2a600 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
2a610 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
2a620 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2a630 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c  _count);.    }el
2a640 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
2a650 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
2a660 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2a670 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2a680 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2a690 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
2a6a0 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20  ash(pList);.    
2a6b0 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
2a6c0 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65  Dirty;.  }..  re
2a6d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a6e0 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
2a6f0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
2a700 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69  le is open. If i
2a710 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
2a720 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  n, this .** func
2a730 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2a740 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2a750 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2a760 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
2a770 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
2a780 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
2a790 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
2a7a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2a7b0 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73  d if a call to s
2a7c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a  qlite3OsOpen() .
2a7d0 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  ** fails..*/.sta
2a7e0 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a  tic int openSubJ
2a7f0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2a800 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2a810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2a820 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2a830 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2a840 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2a850 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2a860 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2a870 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62  Y || pPager->sub
2a880 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2a890 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
2a8a0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2a8b0 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  >sjfd);.    }els
2a8c0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
2a8d0 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
2a8e0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  er, pPager->sjfd
2a8f0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
2a900 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  BJOURNAL);.    }
2a910 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
2a930 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
2a940 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
2a950 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
2a960 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
2a970 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
2a980 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
2a990 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
2a9a0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
2a9b0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
2a9c0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
2a9d0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
2a9e0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
2a9f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
2aa00 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
2aa10 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
2aa20 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
2aa30 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
2aa40 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
2aa50 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
2aa60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2aa70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2aa80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2aa90 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
2aaa0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
2aab0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
2aac0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
2aad0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2aae0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2aaf0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
2ab00 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
2ab10 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
2ab20 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
2ab30 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
2ab40 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
2ab50 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
2ab60 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
2ab70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
2ab80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
2ab90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2aba0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
2abb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2abc0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
2abd0 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20  LMODE_OFF ){..  
2abe0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2abf0 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2ac00 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
2ac10 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a   been opened */.
2ac20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ac30 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2ac40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2ac50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ac60 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  ) || pagerUseWal
2ac70 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2ac80 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2ac90 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20  Pager->sjfd) || 
2aca0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d  pPager->nSubRec=
2acb0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2acc0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2acd0 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
2ace0 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
2acf0 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20  (pPg) .         
2ad00 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2ad10 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2ad20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2ad30 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2ad40 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2ad50 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2ad60 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2ad70 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2ad80 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2ad90 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2ada0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2adb0 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2adc0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2add0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ade0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2adf0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2ae00 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2ae10 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2ae20 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2ae30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2ae40 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2ae50 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
2ae60 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
2ae70 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
2ae80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ae90 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
2aea0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2aeb0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
2aec0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2aed0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2aee0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
2aef0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
2af00 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
2af10 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
2af20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2af30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2af40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2af50 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2af60 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
2af70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2af80 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
2af90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2afa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2afb0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
2afc0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
2afd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2afe0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
2aff0 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
2b000 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2b010 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2b020 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2b040 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2b050 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
2b060 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
2b070 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
2b080 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
2b090 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
2b0a0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
2b0b0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
2b0c0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
2b0d0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
2b0e0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
2b0f0 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
2b100 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
2b110 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
2b120 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
2b130 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
2b140 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
2b150 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
2b160 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
2b170 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
2b180 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
2b190 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
2b1a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2b1b0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
2b1c0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
2b1d0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
2b1e0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
2b1f0 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
2b200 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
2b210 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
2b220 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
2b230 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
2b240 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
2b250 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
2b260 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
2b270 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
2b280 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
2b290 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2b2a0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2b2b0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
2b2c0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
2b2d0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
2b2e0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2b2f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2b300 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
2b310 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
2b320 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
2b330 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2b340 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
2b350 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
2b360 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
2b370 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
2b380 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
2b390 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
2b3a0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2b3b0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
2b3c0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
2b3d0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
2b3e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2b3f0 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
2b400 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
2b410 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2b420 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
2b430 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b440 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
2b450 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
2b460 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2b470 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b480 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
2b490 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
2b4a0 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75  l flag is set du
2b4b0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2b4c0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2b4d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2b4e0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2b4f0 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2b500 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2b510 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2b520 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2b530 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2b540 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2b550 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2b560 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2b570 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2b580 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2b590 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2b5a0 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c  flag inhibits al
2b5b0 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2b5c0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2b5d0 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
2b5e0 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2b5f0 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2b600 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  set during a rol
2b610 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
2b620 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
2b630 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65  o prohibited whe
2b640 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  n in an error st
2b650 61 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63  ate since that c
2b660 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74  ould.  ** lead t
2b670 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
2b680 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20  ption.   In the 
2b690 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
2b6a0 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69  taton it .  ** i
2b6b0 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72  s impossible for
2b6c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
2b6d0 74 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c  tch() to be call
2b6e0 65 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  ed with createFl
2b6f0 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65  ag==1.  ** while
2b700 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2b710 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73  ate, hence it is
2b720 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
2b730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a  this routine to.
2b740 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69    ** be called i
2b750 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b760 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  e.  Nevertheless
2b770 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e  , we include a N
2b780 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74  EVER().  ** test
2b790 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73   for the error s
2b7a0 74 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75  tate as a safegu
2b7b0 61 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75  ard against futu
2b7c0 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f  re changes..  */
2b7d0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
2b7e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
2b7f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b800 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2b810 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74  doNotSpill ) ret
2b820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
2b840 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28  otSyncSpill && (
2b850 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
2b860 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
2b870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2b890 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
2b8a0 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ;.  if( pagerUse
2b8b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
2b8c0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69     /* Write a si
2b8d0 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74  ngle frame for t
2b8e0 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20  his page to the 
2b8f0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  log. */.    if( 
2b900 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2b910 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20  (pPg) ){ .      
2b920 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
2b930 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d  age(pPg); .    }
2b940 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b960 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61  rc = pagerWalFra
2b970 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c  mes(pPager, pPg,
2b980 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
2b990 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
2b9a0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
2b9b0 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
2b9c0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
2b9d0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b9e0 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
2b9f0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2ba00 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2ba10 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
2ba20 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
2ba30 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
2ba40 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2ba50 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
2ba60 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61  umber of this pa
2ba70 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ge is larger tha
2ba80 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
2ba90 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ze of.    ** the
2baa0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
2bab0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
2bac0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2bad0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
2bae0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
2baf0 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
2bb00 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  o pager_write_pa
2bb10 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77  gelist() below w
2bb20 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61  ill not.    ** a
2bb30 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
2bb40 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
2bb50 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
2bb60 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69   **.    ** Consi
2bb70 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
2bb80 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
2bb90 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ents:.    **.   
2bba0 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   **   BEGIN;.   
2bbb0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
2bbc0 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
2bbd0 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
2bbe0 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   X>.    **     S
2bbf0 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20  AVEPOINT sp;.   
2bc00 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
2bc10 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
2bc20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20  to Y pages>.    
2bc30 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
2bc40 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20  ress(page X).   
2bc50 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
2bc60 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20   TO sp;.    **. 
2bc70 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20     ** If (X>Y), 
2bc80 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53  then when pagerS
2bc90 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20  tress is called 
2bca0 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20  page X will not 
2bcb0 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  be written.    *
2bcc0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2bcd0 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20  abase file, but 
2bce0 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20  will be dropped 
2bcf0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20  from the cache. 
2bd00 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c  Then,.    ** fol
2bd10 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
2bd20 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
2bd30 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
2bd40 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
2bd50 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d      ** data from
2bd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bd70 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65  le. This will be
2bd80 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67   the copy of pag
2bd90 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a  e X as it.    **
2bda0 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
2bdb0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
2bdc0 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
2bdd0 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
2bde0 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20   sp".    ** was 
2bdf0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a  executed..    **
2be00 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
2be10 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
2be20 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
2be30 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
2be40 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
2be50 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  b-journal file n
2be60 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ow (if it is not
2be70 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c   already there),
2be80 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
2be90 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f  .    ** be resto
2bea0 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65  red to its curre
2beb0 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  nt value when th
2bec0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
2bed0 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78  p" is .    ** ex
2bee0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ecuted..    */. 
2bef0 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20     if( NEVER(.  
2bf00 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
2bf10 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
2bf20 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
2bf30 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
2bf40 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29  age(pPg).    ) )
2bf50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
2bf60 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2bf70 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2bf80 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
2bf90 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
2bfa0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2bfb0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2bfc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bfd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2bfe0 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
2bff0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2c000 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
2c010 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
2c020 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
2c030 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
2c040 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
2c050 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
2c060 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
2c080 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
2c090 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2c0a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2c0b0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2c0c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2c0d0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
2c0e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
2c0f0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2c100 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc); .}.../*.** 
2c110 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2c120 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
2c130 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
2c140 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
2c150 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
2c160 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
2c170 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
2c180 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
2c190 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
2c1a0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
2c1b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
2c1c0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
2c1d0 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
2c1e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2c1f0 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
2c200 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
2c210 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
2c220 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
2c230 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
2c240 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
2c250 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
2c260 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
2c270 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
2c280 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
2c290 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
2c2a0 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
2c2b0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
2c2c0 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
2c2d0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
2c2e0 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
2c2f0 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
2c300 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
2c310 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
2c320 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
2c330 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2c340 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
2c350 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
2c360 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
2c370 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2c380 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
2c390 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
2c3a0 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
2c3b0 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
2c3c0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
2c3d0 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
2c3e0 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
2c3f0 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
2c400 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
2c410 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2c420 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2c430 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2c440 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2c450 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2c460 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2c470 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2c480 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2c490 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2c4a0 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2c4b0 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2c4c0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2c4d0 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2c4e0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2c4f0 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2c500 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2c510 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2c520 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2c530 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2c540 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2c550 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2c560 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2c570 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2c580 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2c590 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2c5a0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2c5b0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2c5c0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2c5d0 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2c5e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2c5f0 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2c600 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2c610 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2c620 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2c630 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2c640 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2c650 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2c660 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2c670 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2c680 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2c690 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2c6a0 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2c6b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2c6c0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2c6d0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2c6e0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2c6f0 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2c700 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2c710 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2c720 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2c730 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2c740 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2c750 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2c760 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2c770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c780 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2c790 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2c7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2c7b0 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2c7c0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2c7d0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2c7e0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c7f0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2c800 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2c810 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2c820 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c830 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2c840 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2c850 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2c860 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2c870 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2c880 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2c890 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2c8a0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2c8b0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2c8c0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2c8d0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2c8e0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2c8f0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2c900 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2c910 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2c920 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2c930 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2c940 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2c950 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2c960 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2c970 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2c980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2c990 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2c9a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2c9b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2c9c0 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2c9d0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2c9e0 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2c9f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2ca00 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2ca10 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2ca20 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2ca30 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2ca40 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2ca50 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2ca60 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2ca70 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2ca80 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2ca90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2caa0 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2cab0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2cac0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2cad0 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2cae0 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2caf0 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2cb00 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2cb10 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2cb20 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2cb30 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2cb40 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2cb50 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2cb60 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2cb70 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2cb80 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2cb90 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2cba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2cbb0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2cbc0 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2cbd0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2cbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cbf0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2cc00 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2cc10 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2cc20 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2cc30 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2cc40 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2cc50 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2cc60 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2cc70 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2cc80 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2cc90 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2cca0 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20  ). This.  ** is 
2ccb0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
2ccc0 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  e required for a
2ccd0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
2cce0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
2ccf0 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75  .  ** and a regu
2cd00 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
2cd10 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68  -handle. Note th
2cd20 61 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f  at a "regular jo
2cd30 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20  urnal-handle".  
2cd40 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70  ** may be a wrap
2cd50 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63  per capable of c
2cd60 61 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74  aching the first
2cd70 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
2cd80 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
2cd90 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69  e in memory to i
2cda0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f  mplement the ato
2cdb0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
2cdc0 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a  zation (see .  *
2cdd0 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f  * source file jo
2cde0 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20  urnal.c)..  */. 
2cdf0 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
2ce00 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71  nalSize(pVfs)>sq
2ce10 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
2ce20 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75  ize() ){.    jou
2ce30 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2ce40 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2ce50 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2ce60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f  .  }else{.    jo
2ce70 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20  urnalFileSize = 
2ce80 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65  ROUND8(sqlite3Me
2ce90 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b  mJournalSize());
2cea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2ceb0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2cec0 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2ced0 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2cee0 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2cef0 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2cf00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2cf10 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2cf20 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2cf30 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2cf40 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2cf50 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2cf60 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2cf70 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2cf80 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2cf90 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2cfa0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2cfb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2cfc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61  NOMEM;.      nPa
2cfd0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2cfe0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2cff0 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65  me);.      zFile
2d000 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  name = 0;.    }.
2d010 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2d020 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2d030 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2d040 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2d050 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2d060 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2d070 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2d080 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2d090 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2d0a0 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2d0b0 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2d0c0 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2d0d0 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2d0e0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2d0f0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2d100 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2d110 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2d120 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2d130 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2d140 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2d150 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
2d160 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29  (0, nPathname*2)
2d170 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
2d180 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
2d190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d1a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  MEM;.    }.    z
2d1b0 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2d1c0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2d1d0 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2d1e0 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2d1f0 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2d200 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2d210 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2d220 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2d230 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2d240 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2d250 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2d260 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2d270 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2d280 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2d290 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2d2a0 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2d2b0 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2d2c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2d2d0 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2d2e0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2d2f0 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2d300 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28     nUri = (int)(
2d310 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20  &z[1] - zUri);. 
2d320 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e     assert( nUri>
2d330 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
2d340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2d350 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2d360 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2d370 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2d380 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2d390 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2d3a0 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2d3b0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2d3c0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2d3d0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2d3e0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2d3f0 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2d400 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2d410 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2d420 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2d430 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2d440 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2d450 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2d460 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2d470 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2d480 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2d490 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2d4a0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2d4b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2d4c0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2d4d0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2d4e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2d500 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2d510 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2d520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d530 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2d540 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2d550 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2d560 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2d570 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2d580 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2d590 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2d5a0 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2d5b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2d5c0 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2d5d0 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2d5e0 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2d5f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2d600 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d620 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2d630 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2d640 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2d660 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2d670 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2d680 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2d690 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2d6a0 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2d6b0 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2d6c0 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2d6d0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2d6e0 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2d6f0 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2d700 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2d710 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d720 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2d730 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2d740 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2d750 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2d760 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2d770 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2d780 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2d790 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2d7a0 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2d7b0 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2d7c0 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2d7d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2d7e0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2d7f0 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2d800 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2d810 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2d820 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2d830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2d840 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2d850 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2d860 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2d870 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2d880 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2d890 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2d8a0 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2d8b0 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2d8c0 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2d8d0 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2d8e0 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2d8f0 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2d900 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2d910 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2d920 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2d930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d940 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2d950 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2d960 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2d970 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2d980 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2d990 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2d9a0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2d9b0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2d9c0 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2d9d0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2d9e0 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2d9f0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2da00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2da10 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
2da20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
2da30 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
2da40 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
2da50 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
2da60 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
2da70 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
2da80 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
2da90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2daa0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
2dab0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
2dac0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
2dad0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2dae0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
2daf0 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
2db00 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
2db10 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2db20 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2db30 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
2db40 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
2db50 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
2db60 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2db70 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
2db80 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2db90 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
2dba0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2dbb0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
2dbc0 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
2dbd0 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
2dbe0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
2dbf0 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
2dc00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2dc10 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20  nPathname>0 );. 
2dc20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
2dc30 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
2dc40 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
2dc50 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20  e + 1 + nUri);. 
2dc60 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2dc70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
2dc80 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2dc90 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69  e);.    if( nUri
2dca0 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65   ) memcpy(&pPage
2dcb0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
2dcc0 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c  thname+1], zUri,
2dcd0 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2dce0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
2dcf0 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
2dd00 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2dd10 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2dd20 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2dd30 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30  me], "-journal\0
2dd40 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73  00", 8+2);.    s
2dd50 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2dd60 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2dd70 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ame, pPager->zJo
2dd80 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20  urnal);.#ifndef 
2dd90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2dda0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c      pPager->zWal
2ddb0 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75   = &pPager->zJou
2ddc0 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38  rnal[nPathname+8
2ddd0 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  +1];.    memcpy(
2dde0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50  pPager->zWal, zP
2ddf0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2de00 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2de10 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50  &pPager->zWal[nP
2de20 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c  athname], "-wal\
2de30 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20  000", 4+1);.    
2de40 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2de50 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2de60 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57  name, pPager->zW
2de70 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  al);.#endif.    
2de80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2de90 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d   zPathname);.  }
2dea0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
2deb0 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72  = pVfs;.  pPager
2dec0 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73  ->vfsFlags = vfs
2ded0 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65  Flags;..  /* Ope
2dee0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
2def0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2df00 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2df10 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
2df20 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2df40 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
2df50 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
2df60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2df70 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2df80 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2df90 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
2dfa0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
2dfb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65  .    assert( !me
2dfc0 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f  mDb );.    readO
2dfd0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2dfe0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2dff0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e000 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2e010 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2e020 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2e030 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2e040 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2e050 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2e060 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2e070 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2e080 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2e090 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2e0a0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2e0b0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2e0c0 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2e0d0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e0e0 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2e0f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2e100 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2e110 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2e120 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2e130 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2e140 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2e150 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2e160 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2e170 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
2e180 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
2e190 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2e1a0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
2e1b0 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
2e1c0 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
2e1d0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2e1e0 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
2e1f0 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2e200 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2e210 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
2e220 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2e230 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2e240 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e250 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2e260 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2e270 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2e280 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2e290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e2a0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2e2b0 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65   (u32)pPager->se
2e2c0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
2e2d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
2e2e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2e2f0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2e300 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
2e310 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
2e320 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2e330 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
2e340 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
2e350 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
2e360 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2e370 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2e380 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
2e390 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2e3a0 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2e3b0 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2e3c0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2e3d0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2e3e0 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
2e3f0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
2e400 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
2e410 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e420 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
2e430 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
2e440 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2e450 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2e460 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2e470 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2e480 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
2e490 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e4a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2e4b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2e4c0 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
2e4d0 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
2e4e0 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
2e4f0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
2e500 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
2e510 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
2e520 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2e530 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
2e540 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
2e550 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
2e560 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
2e570 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
2e580 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2e590 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2e5a0 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
2e5b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2e5c0 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
2e5d0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2e5e0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2e5f0 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
2e600 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2e610 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
2e620 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
2e630 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
2e640 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
2e650 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
2e660 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2e670 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2e680 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50  R_READER;.    pP
2e690 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58  ager->eLock = EX
2e6a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
2e6b0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2e6c0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2e6d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2e6e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2e6f0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2e700 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2e710 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2e720 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2e730 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2e740 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2e750 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2e760 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2e770 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2e780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2e790 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2e7a0 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2e7b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2e7c0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2e7d0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2e7e0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2e7f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e800 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e810 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2e820 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
2e830 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
2e840 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
2e850 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2e860 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2e870 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2e880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e890 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2e8a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
2e8b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
2e8c0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2e8d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2e8e0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
2e8f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2e900 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2e910 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2e920 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
2e930 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e940 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
2e950 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
2e960 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2e970 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2e980 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
2e9a0 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
2e9b0 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
2e9c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
2e9d0 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
2e9e0 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2e9f0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2ea00 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2ea10 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ea20 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2ea30 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2ea40 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2ea50 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2ea60 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2ea70 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2ea80 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2ea90 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2eaa0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2eab0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2eac0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2ead0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2eae0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2eaf0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2eb00 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2eb10 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2eb20 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2eb30 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2eb40 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2eb50 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2eb60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2eb70 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2eb80 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
2eb90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
2eba0 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
2ebb0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
2ebc0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
2ebd0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2ebe0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
2ebf0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2ec00 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74  tempFile = (u8)t
2ec10 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
2ec20 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
2ec30 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2ec40 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
2ec50 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
2ec60 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2ec70 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
2ec80 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2ec90 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2eca0 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
2ecb0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2ecc0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2ecd0 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e   .  pPager->chan
2ece0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
2ecf0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2ed00 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
2ed10 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
2ed20 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
2ed30 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a  = (u8)readOnly;.
2ed40 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75    assert( useJou
2ed50 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  rnal || pPager->
2ed60 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50  tempFile );.  pP
2ed70 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
2ed80 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2ed90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
2eda0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
2edb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
2edc0 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  lSync==0 );.    
2edd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ede0 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2edf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ee00 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2ee10 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2ee20 74 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53  t( pPager->ckptS
2ee30 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2ee40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
2ee50 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31  er->fullSync = 1
2ee60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2ee70 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2ee80 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2ee90 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2eea0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2eeb0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41  SYNC_NORMAL | WA
2eec0 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49  L_SYNC_TRANSACTI
2eed0 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ONS;.    pPager-
2eee0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
2eef0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2ef00 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  MAL;.  }.  /* pP
2ef10 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
2ef20 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ef30 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
2ef40 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ef50 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
2ef60 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
2ef70 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
2ef80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
2ef90 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
2efa0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
2efb0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
2efc0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2efd0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2efe0 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
2eff0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2f000 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
2f010 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
2f020 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2f030 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2f040 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
2f050 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
2f060 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
2f070 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
2f080 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2f090 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
2f0a0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
2f0b0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
2f0c0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
2f0d0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
2f0e0 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
2f0f0 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
2f100 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
2f110 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
2f120 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
2f130 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
2f140 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
2f150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f160 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
2f170 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2f180 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
2f190 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
2f1a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
2f1b0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
2f1c0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
2f1d0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
2f1e0 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
2f1f0 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
2f200 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
2f210 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
2f220 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
2f230 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
2f240 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
2f250 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
2f260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2f270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
2f280 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
2f290 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2f2a0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
2f2b0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
2f2c0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f2d0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
2f2e0 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
2f2f0 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
2f300 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
2f310 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
2f320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f330 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
2f340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f350 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
2f360 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
2f370 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
2f380 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
2f390 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2f3a0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2f3b0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
2f3c0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
2f3d0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
2f3e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
2f3f0 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
2f400 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
2f410 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
2f420 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
2f430 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
2f440 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
2f450 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2f460 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
2f470 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2f480 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
2f490 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
2f4a0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
2f4b0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
2f4c0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
2f4d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2f4e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
2f4f0 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
2f500 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
2f510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
2f520 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
2f530 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
2f540 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
2f550 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
2f560 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
2f570 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
2f580 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f590 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f5a0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
2f5b0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
2f5c0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
2f5d0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
2f5e0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
2f5f0 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
2f600 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
2f610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f620 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f630 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
2f640 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
2f650 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
2f660 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f670 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
2f680 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
2f690 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
2f6a0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2f6b0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
2f6c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2f6d0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
2f6e0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
2f6f0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2f700 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2f710 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2f720 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
2f730 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
2f740 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
2f750 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f760 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
2f770 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
2f780 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
2f790 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
2f7a0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
2f7b0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
2f7c0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
2f7d0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
2f7e0 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
2f7f0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
2f800 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
2f810 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2f820 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2f830 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2f840 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
2f850 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2f860 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2f870 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f880 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
2f890 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
2f8a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2f8b0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
2f8c0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2f8d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
2f8e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2f8f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2f900 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2f910 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20  AGER_OPEN );..  
2f920 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e  assert( jrnlOpen
2f930 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33  ==0 || ( sqlite3
2f940 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2f950 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2f960 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54  jfd) &.    SQLIT
2f970 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
2f980 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20  BLE_WHEN_OPEN.  
2f990 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20  ));..  *pExists 
2f9a0 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c  = 0;.  if( !jrnl
2f9b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
2f9c0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2f9d0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2f9e0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2f9f0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2fa00 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69  exists);.  }.  i
2fa10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fa20 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
2fa30 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
2fa40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2fa50 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72   True if some pr
2fa60 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
2fa70 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a  SERVED lock */..
2fa80 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64      /* Race cond
2fa90 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f  ition here:  Ano
2faa0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2fab0 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c  ht have been hol
2fac0 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  ding the.    ** 
2fad0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
2fae0 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75  k and have a jou
2faf0 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65  rnal open at the
2fb00 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
2fb10 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
2fb20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20  above, but then 
2fb30 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
2fb40 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20  al and drop the 
2fb50 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20  lock before.    
2fb60 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65  ** we get to the
2fb70 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
2fb80 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2fb90 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49  dLock() call.  I
2fba0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
2fbb0 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20   the case, this 
2fbc0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68  routine might th
2fbd0 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68  ink there is a h
2fbe0 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a  ot journal when.
2fbf0 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74      ** in fact t
2fc00 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54  here is none.  T
2fc10 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61  his results in a
2fc20 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
2fc30 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a  which will.    *
2fc40 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
2fc50 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  by the playback 
2fc60 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74  routine.  Ticket
2fc70 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20   #3883..    */. 
2fc80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2fc90 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2fca0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ck(pPager->fd, &
2fcb0 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28  locked);.    if(
2fcc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fcd0 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20  & !locked ){.   
2fce0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2fd10 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
2fd20 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  le */..      /* 
2fd30 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
2fd40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2fd50 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
2fd60 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
2fd70 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
2fd80 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2fd90 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
2fda0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
2fdb0 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
2fdc0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
2fdd0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
2fde0 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
2fdf0 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
2fe00 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
2fe10 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
2fe20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
2fe30 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
2fe40 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
2fe50 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
2fe60 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2fe70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2fe80 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2fe90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2fea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2feb0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
2fec0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2fed0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
2fee0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
2fef0 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
2ff00 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
2ff10 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
2ff20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ff30 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
2ff40 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
2ff50 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
2ff60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2ff70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2ff80 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
2ff90 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
2ffa0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
2ffb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ffc0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2ffd0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2ffe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fff0 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
30000 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
30010 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
30020 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
30030 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
30040 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
30050 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30060 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
30070 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
30080 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
30090 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
300a0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
300b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
300c0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
300d0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
300e0 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
300f0 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
30100 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
30110 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
30120 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
30130 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
30140 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
30150 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
30160 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
30170 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
30180 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
30190 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
301a0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
301b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
301c0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
301d0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
301e0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
301f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30200 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30220 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
30230 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
30240 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
30250 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
30260 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
30270 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
30280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30290 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
302a0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
302b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
302c0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
302d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
302e0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30300 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
30310 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
30320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30330 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
30340 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
30350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
30360 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
30370 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
30380 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
30390 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
303a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
303b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
303c0 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
303d0 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72  ** its has a zer
303e0 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
303f0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
30400 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
30410 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
30420 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
30430 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
30440 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
30450 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
30460 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
30470 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
30480 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
30490 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
304a0 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
304b0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
304c0 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
304d0 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
304e0 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
304f0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
30500 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
30510 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
30520 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
30530 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
30540 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
30550 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
30560 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
30570 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
30580 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
30590 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
305a0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
305b0 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
305c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
305d0 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
305e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
305f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30600 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30610 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
30620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30640 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
30650 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
30660 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30670 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  abase file..** I
30680 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
30690 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
306a0 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c  rAcquire() until
306b0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
306c0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
306d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61   successfully ca
306e0 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65  lled. If a share
306f0 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  d-lock is alread
30700 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74  y held when.** t
30710 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30720 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
30730 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
30740 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61   following opera
30750 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70  tions are also p
30760 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73  erformed by this
30770 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
30780 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
30790 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
307a0 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  in PAGER_OPEN st
307b0 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
307c0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
307d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
307e0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
307f0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
30800 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
30810 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
30820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
30830 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
30840 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
30850 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
30860 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
30870 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
30880 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30890 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
308a0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
308b0 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
308c0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
308d0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
308e0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
308f0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
30900 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
30910 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
30920 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
30930 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
30940 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30950 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
30960 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
30970 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
30980 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
30990 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
309a0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
309b0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
309c0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
309d0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
309e0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
309f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30a00 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
30a10 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
30a20 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
30a30 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
30a40 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
30a50 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
30a60 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
30a70 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
30a80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
30a90 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
30aa0 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
30ab0 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
30ac0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
30ad0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
30ae0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
30af0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30b00 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
30b10 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
30b20 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
30b30 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
30b40 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
30b50 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20  nal file or .** 
30b60 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
30b70 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
30b80 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
30b90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
30ba0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
30bb0 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
30bc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30bf0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30c00 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
30c10 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
30c20 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
30c30 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
30c40 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
30c50 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
30c60 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74  . This implies t
30c70 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74  hat the pager st
30c80 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65  ate should eithe
30c90 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f  r.  ** be OPEN o
30ca0 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52  r READER. READER
30cb0 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c   is only possibl
30cc0 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  e if the pager i
30cd0 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  s or was in .  *
30ce0 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  * exclusive acce
30cf0 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ss mode..  */.  
30d00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30d10 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
30d20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
30d30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
30d40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
30d50 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
30d60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
30d70 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30d80 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  N || pPager->eSt
30d90 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
30da0 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  R );.  if( NEVER
30db0 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
30dc0 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
30dd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
30de0 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21  Code; }..  if( !
30df0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
30e00 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65  er) && pPager->e
30e10 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
30e20 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f  N ){.    int bHo
30e30 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20  tJournal = 1;   
30e40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30e50 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
30e60 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   hot journal-fil
30e70 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
30e80 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20  ( !MEMDB );..   
30e90 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
30ea0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
30eb0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
30ee0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
30ef0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
30f00 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
30f10 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
30f20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
30f30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30f40 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
30f50 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
30f60 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
30f70 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
30f80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
30f90 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
30fa0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
30fb0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
30fc0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
30fd0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
30fe0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
30ff0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
31000 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
31010 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e  ager, &bHotJourn
31020 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
31030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31040 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31050 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
31060 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   if( bHotJournal
31070 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
31080 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
31090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
310a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
310b0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
310c0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
310d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
310e0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
310f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31100 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
31110 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
31120 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
31130 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
31140 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
31150 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
31160 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
31170 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
31180 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
31190 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
311a0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
311b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
311c0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
311d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
311e0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
311f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
31200 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
31210 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
31220 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
31230 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
31240 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
31250 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
31260 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
31270 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
31280 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
31290 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
312a0 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
312b0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
312c0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
312d0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
312e0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
312f0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
31300 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
31310 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
31320 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
31330 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
31340 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
31350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31360 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31370 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
31380 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e  ger is in lockin
31390 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
313a0 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
313b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e  is.      ** down
313c0 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45 44  graded to SHARED
313d0 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69  _LOCK before thi
313e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
313f0 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ns..      */.   
31400 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
31410 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
31420 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
31430 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31450 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31460 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31470 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
31480 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68  eady open and th
31490 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e  e file exists on
314a0 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20   disk, open the 
314b0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
314c0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
314d0 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20 61   access. Write a
314e0 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72 65  ccess is require
314f0 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20 20  d because .     
31500 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65   ** in exclusive
31510 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
31520 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
31530 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
31540 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  en .      ** and
31550 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
31560 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
31570 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c   later on. Also,
31580 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20   write-access . 
31590 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c       ** is usual
315a0 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 66  ly required to f
315b0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
315c0 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  nal in journal_m
315d0 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20  ode=persist .   
315e0 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20     ** mode (and 
315f0 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c  also for journal
31600 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f  _mode=truncate o
31610 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e  n some systems).
31620 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31630 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
31640 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
31650 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61  , it usually mea
31660 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20  ns that some .  
31670 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
31680 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20  nection managed 
31690 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f  to get in and ro
316a0 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72  ll it back befor
316b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  e .      ** this
316c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
316d0 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
316e0 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
316f0 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  r, it .      ** 
31700 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68  may mean that th
31710 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 74  e pager was in t
31720 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
31730 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a  hen this.      *
31740 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
31750 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
31760 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
31770 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
31780 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
31790 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
317a0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  d) ){.        sq
317b0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
317c0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
317d0 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69  >pVfs;.        i
317e0 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20 20  nt bExists;     
317f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31800 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   if journal file
31810 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
31820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
31830 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
31840 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
31850 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
31860 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
31870 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20  S, &bExists);.  
31880 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31890 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73  LITE_OK && bExis
318a0 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ts ){.          
318b0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
318c0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
318d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
318e0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
318f0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
31900 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31910 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
31920 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
31930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
31940 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
31950 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
31960 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
31970 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  t);.          as
31980 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31990 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
319a0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
319b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
319c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
319d0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
319e0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
319f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31a00 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
31a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
31a20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31a30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
31a50 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
31a60 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
31a70 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
31a80 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
31a90 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
31aa0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
31ab0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
31ac0 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68  d lock. Purge th
31ad0 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20  e cache before. 
31ae0 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20       ** playing 
31af0 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75  back the hot-jou
31b00 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20  rnal so that we 
31b10 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74  don't end up wit
31b20 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e  h.      ** an in
31b30 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
31b40 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20  .  Sync the hot 
31b50 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
31b60 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  laying.      ** 
31b70 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68  it back since th
31b80 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
31b90 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20  rashed and left 
31ba0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a  the hot journal.
31bb0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c        ** probabl
31bc0 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69  y did not sync i
31bd0 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65 71  t and we are req
31be0 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20  uired to always 
31bf0 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68  sync.      ** th
31c00 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
31c10 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b   playing it back
31c20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31c30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
31c40 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31c50 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31c60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31c70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 53       rc = pagerS
31c80 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
31c90 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
31ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31cc0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
31cd0 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
31ce0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31cf0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
31d00 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  PEN;.        }. 
31d10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
31d20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
31d30 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  eMode ){.       
31d40 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
31d50 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31d60 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  CK);.      }..  
31d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31d90 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
31da0 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65  is taken if an e
31db0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
31dc0 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  e trying to open
31dd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72  .        ** or r
31de0 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  oll back a hot-j
31df0 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c  ournal while hol
31e00 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
31e10 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
31e20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c      ** pager_unl
31e30 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69  ock() routine wi
31e40 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  ll be called bef
31e50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  ore returning to
31e60 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20   unlock.        
31e70 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  ** the file. If 
31e80 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d  the unlock attem
31e90 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50  pt fails, then P
31ea0 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20  ager.eLock must 
31eb0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  be.        ** se
31ec0 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
31ed0 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  K (see the comme
31ee0 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
31ef0 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20  fine for .      
31f00 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43    ** UNKNOWN_LOC
31f10 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65  K above for an e
31f20 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20  xplanation). .  
31f30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31f40 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   ** In order to 
31f50 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  get pager_unlock
31f60 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73  () to do this, s
31f70 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  et Pager.eState 
31f80 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41  to.        ** PA
31f90 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54  GER_ERROR now. T
31fa0 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
31fb0 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61  lly counted as a
31fc0 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20   transition.    
31fd0 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20      ** to ERROR 
31fe0 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74 61  state in the sta
31ff0 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74 68  te diagram at th
32000 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
32010 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  le,.        ** s
32020 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
32030 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20  t the same call 
32040 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
32050 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20  ) will very.    
32060 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74      ** shortly t
32070 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61  ransition the pa
32080 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ger object to th
32090 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61  e OPEN state. Ca
320a0 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
320b0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
320c0 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c  ate() would fail
320d0 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75   now, as it shou
320e0 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ld not be possib
320f0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  le.        ** to
32100 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61   be in ERROR sta
32110 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  te when there ar
32120 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69  e zero outstandi
32130 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20 20  ng page .       
32140 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a   ** references..
32150 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32160 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
32170 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
32180 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32190 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
321a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
321b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
321c0 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EN );.      asse
321d0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
321e0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
321f0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
32200 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32210 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
32220 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  >eLock>SHARED_LO
32230 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  CK).      );.   
32240 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61   }..    if( !pPa
32250 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
32260 20 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   (.        pPage
32270 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20 20 20  r->pBackup .    
32280 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
32290 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
322a0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20  r->pPCache)>0 . 
322b0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70      || pPager->p
322c0 4d 61 70 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  Map.    )){.    
322d0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
322e0 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
322f0 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
32300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32310 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
32320 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
32330 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
32340 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
32350 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
32360 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
32370 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
32380 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
32390 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
323a0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
323b0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
323c0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
323d0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
323e0 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
323f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
32400 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
32410 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32420 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
32430 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
32440 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
32450 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
32460 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
32470 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
32480 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
32490 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
324a0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
324b0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
324c0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
324d0 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
324e0 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
324f0 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32500 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32510 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32520 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
32530 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
32540 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
32550 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
32560 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
32570 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
32580 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
32590 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
325a0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
325b0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
325c0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
325d0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
325e0 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
325f0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32600 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32610 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32620 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
32630 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
32640 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32650 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
32660 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
32670 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
32680 20 6e 50 61 67 65 3e 30 20 7c 7c 20 70 50 61 67   nPage>0 || pPag
32690 65 72 2d 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20  er->pMap ){.    
326a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
326b0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
326c0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
326d0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
326e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
326f0 3e 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  >pMap ){.       
32700 20 20 20 6d 65 6d 63 70 79 28 26 64 62 46 69 6c     memcpy(&dbFil
32710 65 56 65 72 73 2c 20 26 28 28 75 38 20 2a 29 28  eVers, &((u8 *)(
32720 70 50 61 67 65 72 2d 3e 70 4d 61 70 29 29 5b 32  pPager->pMap))[2
32730 34 5d 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  4], sizeof(dbFil
32740 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20  eVers));.       
32750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32760 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
32770 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
32780 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
32790 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
327a0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  , 24);.        }
327b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
327c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
327d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
327e0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
327f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32800 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
32810 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
32820 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
32830 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32840 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
32850 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
32860 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
32870 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
32880 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
32890 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
328a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61  .        /* Unma
328b0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  p the database f
328c0 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69  ile. It is possi
328d0 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61  ble that externa
328e0 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20  l processes.    
328f0 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20      ** may have 
32900 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61  truncated the da
32910 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
32920 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74  then extended it
32930 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a   back.        **
32940 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
32950 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73   size while this
32960 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74   process was not
32970 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e   holding a lock.
32980 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
32990 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d  his case there m
329a0 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72  ay exist a Pager
329b0 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68  .pMap mapping th
329c0 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20  at appears.     
329d0 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20     ** to be the 
329e0 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69  right size but i
329f0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76  s not actually v
32a00 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73  alid. Avoid this
32a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
32a20 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70  ibility by unmap
32a30 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65  ping the db here
32a40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67  . */.        pag
32a50 65 72 55 6e 6d 61 70 28 70 50 61 67 65 72 29 3b  erUnmap(pPager);
32a60 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
32a70 20 70 50 61 67 65 72 2d 3e 70 4d 61 70 20 29 7b   pPager->pMap ){
32a80 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
32a90 3e 62 4d 61 70 52 65 73 69 7a 65 20 3d 20 31 3b  >bMapResize = 1;
32aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
32ab0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
32ac0 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
32ad0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
32ae0 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
32af0 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
32b00 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
32b10 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
32b20 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
32b30 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
32b40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
32b50 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
32b60 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64  t(pPager);.#ifnd
32b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
32b80 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  AL.    assert( p
32b90 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c  Pager->pWal==0 |
32ba0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
32bb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
32bc0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
32bd0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
32be0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
32bf0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
32c00 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  = pagerBeginRead
32c10 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
32c20 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
32c30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32c40 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
32c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32c60 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
32c70 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
32c80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
32c90 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
32ca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32cb0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
32cc0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
32cd0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
32ce0 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
32cf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
32d00 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
32d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
32d20 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
32d30 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a  GER_READER;.  }.
32d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
32d50 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
32d60 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
32d70 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
32d80 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
32d90 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
32da0 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
32db0 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
32dc0 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
32dd0 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
32de0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
32df0 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
32e00 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
32e10 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
32e20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
32e30 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
32e40 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
32e50 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
32e60 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
32e70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
32e80 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
32e90 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
32ea0 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
32eb0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
32ec0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
32ed0 68 65 29 3d 3d 30 29 20 26 26 20 70 50 61 67 65  he)==0) && pPage
32ee0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29  r->nMmapOut==0 )
32ef0 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
32f00 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
32f10 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
32f20 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
32f30 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
32f40 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
32f50 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
32f60 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
32f70 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
32f80 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
32f90 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
32fa0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
32fb0 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
32fc0 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
32fd0 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
32fe0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
32ff0 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
33000 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
33010 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
33020 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
33030 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
33040 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
33050 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
33060 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
33070 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
33080 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33090 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
330a0 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
330b0 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
330c0 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
330d0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
330e0 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
330f0 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
33100 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
33110 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
33120 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
33130 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
33140 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
33150 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
33160 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
33170 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
33180 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
33190 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
331a0 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
331b0 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
331c0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
331d0 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
331e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
331f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
33200 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
33210 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
33220 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
33230 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
33240 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
33250 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
33260 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
33270 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
33280 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
33290 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
332a0 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
332b0 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
332c0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
332d0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
332e0 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
332f0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
33300 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
33310 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
33320 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
33330 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
33340 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
33350 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
33360 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
33370 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
33380 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
33390 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
333a0 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
333b0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
333c0 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
333d0 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
333e0 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f  eperate scenario
333f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
33400 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
33410 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
33420 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33430 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
33440 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
33450 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
33460 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
33470 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
33480 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
33490 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
334a0 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
334b0 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
334c0 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
334d0 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
334e0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
334f0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
33500 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
33510 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
33520 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
33530 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
33540 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
33550 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
33560 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
33570 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
33580 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
33590 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
335a0 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
335b0 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
335c0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
335d0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
335e0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
335f0 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
33600 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
33610 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
33620 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
33630 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
33640 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
33650 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
33660 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
33670 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33680 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
33690 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
336a0 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
336b0 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
336c0 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
336d0 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
336e0 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
336f0 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
33700 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
33710 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
33720 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
33730 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
33740 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
33750 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
33760 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
33770 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
33780 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
33790 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
337a0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
337b0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
337c0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
337d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
337e0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
337f0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
33800 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
33810 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
33820 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
33830 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
33840 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
33850 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
33860 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
33870 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
33880 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
33890 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
338a0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
338b0 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
338c0 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
338d0 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
338e0 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
338f0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
33900 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
33910 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33920 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
33930 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
33940 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
33950 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
33960 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
33970 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
33980 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33990 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
339a0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
339b0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
339c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
339d0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
339e0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
339f0 20 20 2f 2a 20 50 41 47 45 52 5f 41 43 51 55 49    /* PAGER_ACQUI
33a00 52 45 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  RE_XXX flags */.
33a10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
33a30 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32   *pPg = 0;.  u32
33a40 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
33a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a60 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72  Frame to read fr
33a70 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20  om WAL file */. 
33a80 20 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e   const int noCon
33a90 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20  tent = (flags & 
33aa0 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f  PAGER_ACQUIRE_NO
33ab0 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a 20  CONTENT);..  /* 
33ac0 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  It is acceptable
33ad0 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f   to use a read-o
33ae0 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20  nly (mmap) page 
33af0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63  for any page exc
33b00 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20  ept.  ** page 1 
33b10 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
33b20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
33b30 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51   open or the ACQ
33b40 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  UIRE_READONLY.  
33b50 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  ** flag was spec
33b60 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  ified by the cal
33b70 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67  ler. And so long
33b80 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f   as the db is no
33b90 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  t a .  ** tempor
33ba0 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
33bb0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
33bc0 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70   const int bMmap
33bd0 4f 6b 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 4d  Ok = (pPager->nM
33be0 61 70 4c 69 6d 69 74 3e 30 20 26 26 20 70 67 6e  apLimit>0 && pgn
33bf0 6f 21 3d 31 0a 20 20 20 26 26 20 28 70 50 61 67  o!=1.   && (pPag
33c00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33c10 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33c20 67 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49  gs & PAGER_ACQUI
33c30 52 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20  RE_READONLY)).  
33c40 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33c50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
33c60 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
33c70 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33c80 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33c90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
33ca0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20  noContent==0 || 
33cb0 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20  bMmapOk==0 );.. 
33cc0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a   if( pgno==0 ){.
33cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33ce0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33cf0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33d00 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
33d10 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
33d20 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d  turn an error im
33d30 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a  mediately. .  **
33d40 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75   Otherwise, requ
33d50 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f  est the page fro
33d60 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79  m the PCache lay
33d70 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  er. */.  if( pPa
33d80 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
33d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33da0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
33db0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  ode;.  }else{.. 
33dc0 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26     if( bMmapOk &
33dd0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
33de0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
33df0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
33e00 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
33e10 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
33e20 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33e40 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33e50 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
33e60 20 20 20 69 66 28 20 69 46 72 61 6d 65 3d 3d 30     if( iFrame==0
33e70 20 26 26 20 62 4d 6d 61 70 4f 6b 20 29 7b 0a 20   && bMmapOk ){. 
33e80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
33e90 3e 70 4d 61 70 3d 3d 30 20 7c 7c 20 28 70 50 61  >pMap==0 || (pPa
33ea0 67 65 72 2d 3e 62 4d 61 70 52 65 73 69 7a 65 20  ger->bMapResize 
33eb0 26 26 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  && pPager->nMmap
33ec0 4f 75 74 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Out==0) ){.     
33ed0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4d 61 70     rc = pagerMap
33ee0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
33ef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
33f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33f10 70 50 61 67 65 72 2d 3e 6e 4d 61 70 3e 3d 28 28  pPager->nMap>=((
33f20 69 36 34 29 70 67 6e 6f 20 2a 20 70 50 61 67 65  i64)pgno * pPage
33f30 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
33f40 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33f50 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
33f60 5f 52 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20  _READER ){.     
33f70 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
33f80 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
33f90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33fa0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
33fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33fc0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
33fd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
33fe0 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
33ff0 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
34000 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  &pPg);.        }
34010 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
34020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
34030 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
34040 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
34050 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
34060 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
34070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
34080 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
340a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
340b0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
340c0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
340d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
340e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
340f0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
34100 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70  che, pgno, 1, pp
34110 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
34120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34130 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
34140 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
34150 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
34160 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
34170 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
34180 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
34190 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
341a0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
341b0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
341c0 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
341d0 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
341e0 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
341f0 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
34200 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
34210 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34220 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
34230 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
34240 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
34250 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
34260 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50  age)->pPager==pP
34270 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65  ager || (*ppPage
34280 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  )->pPager==0 );.
34290 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
342a0 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
342b0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
342c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
342d0 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
342e0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
342f0 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
34300 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
34310 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
34320 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
34330 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
34340 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
34350 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
34360 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34370 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) );.    pPager-
34380 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
34390 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65  T_HIT]++;.    re
343a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
343b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
343c0 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
343d0 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
343e0 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
343f0 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
34400 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
34410 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70  ized.  */..    p
34420 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20  Pg = *ppPage;.  
34430 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
34440 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20  pPager;..    /* 
34450 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
34460 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
34470 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
34480 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
34490 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  .    ** number g
344a0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
344b0 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20  , or the unused 
344c0 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73  locking-page, is
344d0 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20   requested. */. 
344e0 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
344f0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
34500 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
34510 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
34520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
34530 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
34540 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34550 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
34560 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
34570 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
34580 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
34590 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
345a0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
345b0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
345c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
345d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
345e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
345f0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34600 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34610 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
34620 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
34630 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
34640 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
34650 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
34660 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
34670 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
34680 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
34690 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
346a0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
346b0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
346c0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
346d0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
346e0 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
346f0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
34700 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
34710 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
34720 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
34730 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
34740 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
34750 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
34760 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
34770 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
34780 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
34790 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
347a0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
347b0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
347c0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
347d0 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
347e0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
347f0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
34800 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
34810 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
34820 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
34830 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
34840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34850 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
34860 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
34870 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
34880 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
34890 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
348a0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
348b0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
348c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
348d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
348e0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
348f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34900 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
34910 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
34920 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
34930 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
34940 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73       if( pagerUs
34950 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
34960 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20  bMmapOk==0 ){.  
34970 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34980 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
34990 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
349a0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
349b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
349c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
349d0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
349e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
349f0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
34a00 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
34a10 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
34a20 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
34a30 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
34a40 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
34a50 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
34a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34a70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
34a80 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34a90 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34aa0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
34ab0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
34ac0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
34ad0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
34ae0 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
34af0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34b00 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
34b10 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
34b20 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
34b30 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
34b40 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
34b50 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
34b60 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
34b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
34b80 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
34b90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
34ba0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
34bb0 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
34bc0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
34bd0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
34be0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
34bf0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
34c00 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34c10 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a  in cache. .**.**
34c20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
34c30 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
34c40 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
34c50 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
34c60 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
34c70 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
34c80 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
34c90 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
34ca0 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
34cb0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
34cc0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34cd0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
34ce0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
34cf0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
34d00 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
34d10 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
34d20 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
34d30 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
34d40 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
34d50 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
34d60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
34d70 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
34d80 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
34d90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
34da0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
34db0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno!=0 );.  asse
34dc0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61  rt( pPager->pPCa
34dd0 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  che!=0 );.  asse
34de0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34df0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
34e00 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
34e10 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
34e20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
34e30 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34e40 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
34e50 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75 72  , &pPg);.  retur
34e60 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
34e70 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72  Release a page r
34e80 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  eference..**.** 
34e90 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
34ea0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
34eb0 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
34ec0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
34ed0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
34ee0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
34ef0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
34f00 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
34f10 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
34f20 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
34f30 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
34f40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
34f50 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
34f60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
34f70 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
34f80 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
34f90 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
34fa0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
34fb0 70 50 61 67 65 72 3b 0a 20 20 20 20 69 66 28 20  pPager;.    if( 
34fc0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
34fd0 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 20  DR_MMAP ){.     
34fe0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
34ff0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
35000 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
35010 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
35020 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
35030 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
35040 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
35050 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
35060 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
35070 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
35080 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
35090 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
350a0 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
350b0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
350c0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
350d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
350e0 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
350f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35100 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
35110 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
35120 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
35130 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
35140 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
35150 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
35160 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
35170 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
35180 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
35190 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
351a0 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
351b0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
351c0 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
351d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
351e0 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
351f0 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
35200 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
35210 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
35220 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
35230 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
35240 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
35250 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
35260 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
35270 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
35280 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
35290 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
352a0 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
352b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
352c0 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
352d0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
352e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
352f0 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
35300 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
35310 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
35320 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
35330 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
35340 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
35350 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
35360 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
35370 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
35380 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
35390 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
353a0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
353b0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
353c0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
353d0 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
353e0 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
353f0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
35400 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
35410 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
35420 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
35430 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
35440 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
35450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
35460 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
35470 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
35480 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35490 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
354a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
354b0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
354c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
354d0 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
354e0 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
354f0 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
35500 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
35510 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35520 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
35530 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
35540 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
35550 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
35560 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
35570 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35580 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
35590 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
355a0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
355b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
355c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
355d0 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
355e0 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
355f0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
35600 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
35610 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
35620 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
35630 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
35640 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
35650 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35660 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
35670 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
35680 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
35690 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
356a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
356b0 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  FF ){.    pPager
356c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
356d0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
356e0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
356f0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
35700 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
35710 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
35720 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
35730 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
35740 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
35750 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
35760 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
35770 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f   */.    if( !isO
35780 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
35790 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
357a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
357b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
357c0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
357d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65         sqlite3Me
357e0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
357f0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
35800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35810 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
35820 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =               
35830 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
35840 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   to open journal
35850 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
35860 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
35870 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
35880 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
35890 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
358a0 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20  tempFile ? .    
358b0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
358c0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
358d0 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
358e0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
358f0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
35900 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
35910 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29  NAL).          )
35920 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ;.  #ifdef SQLIT
35930 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
35940 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 72 63  WRITE.        rc
35950 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
35960 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20  lOpen(.         
35970 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
35980 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
35990 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
359a0 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
359b0 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 29 3b  ager).        );
359c0 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 20  .  #else.       
359d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
359e0 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
359f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35a00 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
35a10 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  0);.  #endif.   
35a20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
35a30 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
35a40 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
35a50 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
35a60 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
35a70 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
35a80 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
35a90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35aa0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
35ab0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
35ac0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
35ad0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
35ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35af0 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
35b00 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
35b10 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
35b20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
35b30 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
35b40 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
35b50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
35b60 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
35b70 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
35b80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35b90 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
35ba0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
35bb0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
35bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
35bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
35bf0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
35c00 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
35c10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
35c20 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
35c30 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
35c40 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
35c50 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35c60 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
35c70 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
35c80 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
35c90 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
35ca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
35cb0 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
35cc0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
35cd0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
35ce0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
35cf0 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
35d00 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
35d10 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
35d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
35d30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
35d40 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
35d50 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
35d60 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
35d70 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
35d80 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
35d90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
35da0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
35db0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
35dc0 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
35dd0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
35de0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
35df0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
35e00 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
35e10 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
35e20 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
35e30 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
35e40 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
35e50 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
35e60 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
35e70 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
35e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
35e90 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
35ea0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
35eb0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
35ec0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
35ed0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
35ee0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
35ef0 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
35f00 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
35f10 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
35f20 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
35f30 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
35f40 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
35f50 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
35f60 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
35f70 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
35f80 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
35f90 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
35fa0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
35fb0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
35fc0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
35fd0 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
35fe0 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
35ff0 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
36000 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
36010 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
36020 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
36030 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
36040 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
36050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36060 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
36070 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
36080 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
360a0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
360b0 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
360c0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
360d0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67  _ERROR );.  pPag
360e0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
360f0 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
36100 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  ory;..  if( ALWA
36110 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  YS(pPager->eStat
36120 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29  e==PAGER_READER)
36130 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
36140 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36150 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  al==0 );..    if
36160 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
36170 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  ager) ){.      /
36180 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
36190 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
361a0 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  use locking_mode
361b0 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20  =exclusive, and 
361c0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  an.      ** excl
361d0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
361e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
361f0 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  t already held, 
36200 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20  obtain it now.. 
36210 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
36220 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
36230 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74  iveMode && sqlit
36240 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
36250 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
36260 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
36270 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
36280 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
36290 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
362a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
362b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
362c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
362d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
362e0 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
362f0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
36300 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
36310 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
36320 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
36330 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
36340 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
36350 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
36360 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
36370 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
36380 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
36390 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
363a0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
363b0 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
363c0 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
363d0 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
363e0 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
363f0 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
36400 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
36410 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
36420 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
36430 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  all it..      */
36440 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36450 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
36460 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
36470 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
36480 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
36490 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
364a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
364b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
364c0 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
364d0 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
364e0 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
364f0 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
36500 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
36510 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
36520 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
36530 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
36540 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
36550 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
36560 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
36570 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
36580 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
36590 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
365a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
365b0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
365c0 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
365d0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
365e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
365f0 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20  K && exFlag ){. 
36600 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36610 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
36620 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
36630 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
36640 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
36650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36660 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
36670 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  to WRITER_LOCKED
36680 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
36690 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
366a0 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53  de sets Pager.eS
366b0 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52  tate to PAGER_WR
366c0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43  ITER_LOCKED or C
366d0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
366e0 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
366f0 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
36700 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
36710 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
36720 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
36730 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
36740 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
36750 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
36760 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
36770 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36780 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
36790 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
367a0 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
367b0 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
367c0 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
367d0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
367e0 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
367f0 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
36800 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
36810 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
36820 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
36830 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
36840 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  ER_LOCKED;.     
36850 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
36860 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36870 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
36880 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
36890 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
368a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
368b0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
368c0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
368d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
368e0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lOff = 0;.    }.
368f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
36900 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
36910 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36920 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
36930 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
36940 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
36950 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36960 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
36970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
36980 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
36990 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a  (pPager) );.  }.
369a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
369b0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
369c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
369d0 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r)));.  return r
369e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
369f0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
36a00 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
36a10 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
36a20 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
36a30 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
36a40 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
36a50 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
36a60 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
36a70 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
36a80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
36a90 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
36aa0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
36ab0 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
36ac0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
36ad0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
36ae0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
36af0 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
36b00 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
36b10 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
36b20 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
36b30 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
36b40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
36b50 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
36b60 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
36b70 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
36b80 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
36b90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
36ba0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
36bb0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75   is not called u
36bc0 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72  nless a write-tr
36bd0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
36be0 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e  ready .  ** been
36bf0 20 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f   started. The jo
36c00 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
36c10 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
36c20 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  n at this point.
36c30 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  .  ** It is neve
36c40 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20  r called in the 
36c50 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a  ERROR state..  *
36c60 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
36c70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36c80 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
36c90 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36ca0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36cb0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
36cc0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36cd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36ce0 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
36cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
36d00 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
36d10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
36d20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
36d30 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
36d40 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74  detected, report
36d50 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a   the same error.
36d60 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68 69 73    ** again. This
36d70 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70   should not happ
36d80 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68 65 63  en, but the chec
36d90 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62 75 73  k provides robus
36da0 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20  tness. */.  if( 
36db0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
36dc0 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72 6e  rCode) )  return
36dd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36de0 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c  ;..  /* Higher-l
36df0 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65  evel routines ne
36e00 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ver call this fu
36e10 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62 61  nction if databa
36e20 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77  se is not.  ** w
36e30 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63 68  ritable.  But ch
36e40 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73 74  eck anyway, just
36e50 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 2e   for robustness.
36e60 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
36e70 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
36e80 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
36e90 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b  E_PERM;..  CHECK
36ea0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
36eb0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
36ec0 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f  le needs to be o
36ed0 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65  pened. Higher le
36ee0 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76  vel routines hav
36ef0 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f  e already.  ** o
36f00 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
36f10 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62  ssary locks to b
36f20 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74  egin the write-t
36f30 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
36f40 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  the.  ** rollbac
36f50 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
36f60 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
36f70 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20   Open it now if 
36f80 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
36f90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
36fa0 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
36fb0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
36fc0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
36fd0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20   on the page. . 
36fe0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
36ff0 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61  f it were done a
37000 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fter calling sql
37010 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37020 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a  rty(), then.  **
37030 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20   an error might 
37040 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61  occur and the pa
37050 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70  ger would end up
37060 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   in WRITER_LOCKE
37070 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74  D state.  ** wit
37080 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20 61  h pages marked a
37090 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20 63  s dirty in the c
370a0 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ache..  */.  if(
370b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
370c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
370d0 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  CKED ){.    rc =
370e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
370f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
37100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37110 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
37130 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
37140 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37150 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
37160 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37170 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
37180 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
37190 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
371a0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
371b0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
371c0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
371d0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
371e0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
371f0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
37200 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
37210 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
37220 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
37230 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
37240 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
37250 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
37260 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
37270 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a   );.  }else{.  .
37280 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
37290 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
372a0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
372b0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
372c0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
372d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
372e0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
372f0 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
37300 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
37310 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
37320 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
37330 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
37340 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
37350 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
37360 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
37370 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
37380 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
37390 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
373a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
373b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
373c0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
373d0 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26 20 69  >dbOrigSize && i
373e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
373f0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  d) ){.        u3
37400 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
37410 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
37420 20 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20         i64 iOff 
37430 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
37440 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f  lOff;..        /
37450 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
37460 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
37470 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
37480 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
37490 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
374a0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
374b0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
374c0 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
374d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
374e0 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
374f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37500 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
37510 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
37520 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
37530 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
37540 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e  nalHdr<=pPager->
37550 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
37560 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
37570 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
37580 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
37590 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
375a0 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
375b0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
375c0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
375d0 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20 20  )pData2);..     
375e0 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
375f0 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
37600 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
37610 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
37620 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
37630 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
37640 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
37650 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
37660 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
37670 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
37680 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
37690 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
376a0 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
376b0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
376c0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
376d0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
376e0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
376f0 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
37700 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
37710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37720 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
37730 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
37740 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
37750 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
37760 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
37770 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
37780 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
37790 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
377a0 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  YNC;..        rc
377b0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
377c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66  Pager->jfd, iOff
377d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
377e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
377f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
37800 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
37810 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
37820 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
37830 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
37840 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b  geSize, iOff+4);
37850 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
37860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37870 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
37880 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
37890 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
378a0 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ff+pPager->pageS
378b0 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20  ize+4, cksum);. 
378c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
378d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
378e0 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 49  n rc;..        I
378f0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
37900 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
37910 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37920 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
37930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37940 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
37950 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
37960 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
37970 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
37980 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
37990 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
379a0 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
379b0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
379c0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
379d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
379e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
379f0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
37a00 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
37a10 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
37a20 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
37a30 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
37a40 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ;..        pPage
37a50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
37a60 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67   8 + pPager->pag
37a70 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70  eSize;.        p
37a80 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
37a90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37aa0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37ab0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
37ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
37ad0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
37ae0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
37af0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
37b00 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
37b10 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
37b20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
37b30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
37b40 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
37b50 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
37b60 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
37b70 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
37b80 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
37b90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37ba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37bb0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37bc0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
37bd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37c00 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
37c10 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
37c20 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
37c30 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
37c40 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
37c50 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
37c60 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
37c70 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
37c80 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
37c90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
37ca0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
37cb0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
37cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
37cd0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
37ce0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
37cf0 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
37d00 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
37d10 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37d20 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
37d30 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
37d40 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
37d50 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
37d60 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
37d70 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
37d80 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
37d90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
37da0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
37db0 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
37dc0 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
37dd0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
37de0 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
37df0 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
37e00 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
37e10 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
37e20 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
37e30 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
37e40 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
37e50 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
37e60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
37e70 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
37e80 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
37e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37ea0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
37eb0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
37ec0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
37ed0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
37ee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37ef0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
37f00 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
37f10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
37f20 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
37f30 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
37f40 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
37f50 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
37f60 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
37f70 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
37f80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
37f90 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
37fa0 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
37fb0 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
37fc0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
37fd0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
37fe0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
37ff0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
38000 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
38010 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
38020 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
38030 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
38040 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
38050 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
38060 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
38070 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
38080 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
38090 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
380a0 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
380b0 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
380c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
380d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
380e0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
380f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
38100 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
38110 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
38120 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
38130 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
38140 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
38150 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
38160 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
38170 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
38180 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
38190 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
381a0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
381b0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
381c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
381d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
381e0 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
381f0 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
38200 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
38210 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61  >pageSize);..  a
38220 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
38230 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 29  gs & PGHDR_MMAP)
38240 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
38250 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
38260 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
38270 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
38280 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
38290 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
382a0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
382b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
382c0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
382d0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
382e0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
382f0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
38300 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
38310 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
38320 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
38330 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
38340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38350 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
38360 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
38370 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
38380 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30     int nPage = 0
38390 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
383a0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
383b0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
383c0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
383d0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
383e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
383f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
38400 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
38410 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
38420 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
38430 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
38440 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
38450 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
38460 63 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31  cSpill flag to 1
38470 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
38480 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
38490 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e  w.    ** a journ
384a0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  al header to be 
384b0 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
384c0 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
384d0 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  led by.    ** th
384e0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
384f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
38500 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
38510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
38520 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20  NotSyncSpill==0 
38530 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
38540 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b  oNotSyncSpill++;
38550 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
38560 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
38570 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
38580 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
38590 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
385a0 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
385b0 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
385c0 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
385d0 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
385e0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
385f0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
38600 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
38610 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
38620 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
38630 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
38640 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
38650 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
38660 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  nt = pPager->dbS
38670 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67  ize;.    if( pPg
38680 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
38690 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
386a0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
386b0 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
386c0 65 20 69 66 28 20 28 70 67