/ Hex Artifact Content
Login

Artifact 47637146719cb936a8121e9e4c5f1adbde1765dc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 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 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 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 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 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 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72 61  ss */.  u8 extra
7530: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
7540: 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72 65      /* sync dire
7550: 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75 72  ctory after jour
7560: 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  nal delete */.  
7570: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7590: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75a0: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
75b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
75c0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
75e0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
75f0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
7600: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7610: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7620: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7630: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7640: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7650: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7670: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7680: 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61  porary or immuta
7690: 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ble file */.  u8
76a0: 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
76b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76c0: 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74  not lock (except
76d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f   in WAL mode) */
76e0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
7710: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
7720: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
7750: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
7760: 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a   */..  /********
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
77c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
77d0: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
77e0: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68   members that ch
77f0: 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  ange during.  **
7800: 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69   routine operati
7810: 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65  on.  Class membe
7820: 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62  rs not in this b
7830: 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72 20  lock are either 
7840: 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20  fixed.  ** when 
7850: 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69 72  the pager is fir
7860: 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c  st created or el
7870: 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77  se only change w
7880: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20  hen there is a. 
7890: 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20   ** significant 
78a0: 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75 63  mode change (suc
78b0: 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68  h as changing th
78c0: 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63  e page_size, loc
78d0: 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20  king_mode,.  ** 
78e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  or the journal_m
78f0: 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74  ode).  From anot
7900: 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65 20  her view, these 
7910: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7920: 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20  scribe.  ** the 
7930: 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20 70  "state" of the p
7940: 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65  ager, while othe
7950: 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  r class members 
7960: 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a  describe the.  *
7970: 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  * "configuration
7980: 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  " of the pager..
7990: 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65    */.  u8 eState
79a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74     /* Pager stat
79c0: 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c  e (OPEN, READER,
79d0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e   WRITER_LOCKED..
79e0: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
7a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
7a20: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
7a30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
7a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
7a50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
7a60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
7a70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
7a80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7aa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
7ab0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
7ac0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
7ad0: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7af0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
7b00: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
7b10: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7b20: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7b30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7b40: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7b50: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62  urnals */.  u8 b
7b60: 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20 20  UseFetch;       
7b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7b80: 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29 20  to use xFetch() 
7b90: 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53  */.  u8 hasHeldS
7ba0: 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20  haredLock;      
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73 68   /* True if a sh
7bc0: 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76  ared lock has ev
7bd0: 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a  er been held */.
7be0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7c10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7c20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7c30: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7c40: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7c50: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7c60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7c70: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7ca0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7cb0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7cc0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7cd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7ce0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7cf0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7d00: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7d30: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7d70: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7d80: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7d90: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7da0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7db0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7dc0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7dd0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7de0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7e10: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7e20: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7e30: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7e40: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7e50: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7e60: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7e70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7e90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7ea0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7eb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ed0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7ee0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ef0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7f00: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7f10: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7f20: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7f30: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7f40: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7f50: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7f60: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7f70: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7f80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7f90: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7fa0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7fb0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7fc0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7fd0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ff0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
8000: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
8010: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
8020: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
8030: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
8040: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
8050: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
8060: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
8070: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
8080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8090: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
80a0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
80b0: 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61  t[] */.  u32 iDa
80c0: 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20  taVersion;      
80d0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
80e0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
80f0: 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65  e content change
8100: 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  s */.  char dbFi
8110: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
8120: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
8130: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
8140: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
8150: 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b  .  int nMmapOut;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70  * Number of mmap
8180: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
8190: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a   outstanding */.
81a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
81b0: 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  szMmap;       /*
81c0: 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d   Desired maximum
81d0: 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20   mmap size */.  
81e0: 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65  PgHdr *pMmapFree
81f0: 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  list;       /* L
8200: 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70  ist of free mmap
8210: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70   page headers (p
8220: 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20  Dirty) */.  /*. 
8230: 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72   ** End of the r
8240: 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e  outinely-changin
8250: 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a  g class members.
8260: 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    **************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
82b0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82d0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
82e0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
82f0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
8300: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8320: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8330: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
8340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
8350: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8370: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
8380: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
8390: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
83a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
83b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
83c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
83d0: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61  back */.  int pa
83e0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
83f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8400: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
8410: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
8420: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8430: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
8440: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
8450: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
8460: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8470: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
8480: 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70  Size limit for p
8490: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
84a0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61  l files */.  cha
84b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
84c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
84d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
84e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
84f0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
8500: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8510: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
8520: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
8530: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
8540: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
8550: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
8560: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
8570: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
8580: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
8590: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
85a0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  Handler */.  int
85b0: 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20   aStat[3];      
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
85d0: 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69  l cache hits, mi
85e0: 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20  sses and writes 
85f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8600: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61  _TEST.  int nRea
8610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8620: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8630: 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65  pages read */.#e
8640: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
8650: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
8660: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
8670: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
8680: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
8690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
86a0: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
86b0: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
86c0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
86d0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
86e0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
86f0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
8700: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
8710: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
8720: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
8730: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
8740: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
8750: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
8760: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
8770: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
8780: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
8790: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
87a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
87b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
87c0: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
87d0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
87e0: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
87f0: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
8800: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
8810: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
8820: 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50   */.  PCache *pP
8830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
8840: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8850: 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63  page cache objec
8860: 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  t */.#ifndef SQL
8870: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57  ITE_OMIT_WAL.  W
8880: 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20  al *pWal;       
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
88a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73  ite-ahead log us
88b0: 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ed by "journal_m
88c0: 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68  ode=wal" */.  ch
88d0: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
88e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
88f0: 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65  e name for write
8900: 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65  -ahead log */.#e
8910: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
8920: 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77  ndexes for use w
8930: 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b  ith Pager.aStat[
8940: 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74  ]. The Pager.aSt
8950: 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  at[] array conta
8960: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
8970: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  s accessed by pa
8980: 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53  ssing SQLITE_DBS
8990: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
89a0: 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20   CACHE_MISS .** 
89b0: 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74  or CACHE_WRITE t
89c0: 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61  o sqlite3_db_sta
89d0: 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tus()..*/.#defin
89e0: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  e PAGER_STAT_HIT
89f0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
8a00: 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a  ER_STAT_MISS  1.
8a10: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a20: 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a  AT_WRITE 2../*.*
8a30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8a40: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8a50: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8a60: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8a70: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8a80: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a90: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8aa0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8ab0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8ac0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8ad0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8ae0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8af0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8b00: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8b10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8b20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8b30: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8b40: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8b50: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8b60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8b70: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8b80: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8b90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8ba0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8bb0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8bc0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8bd0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8be0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8bf0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8c00: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8c10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8c20: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8c40: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8c50: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8c60: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8c70: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8c80: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8c90: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8ca0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8cb0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8cc0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8ce0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8cf0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8d00: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8d10: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8d20: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8d40: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8d50: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8d60: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8d70: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8d80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8d90: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8da0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8db0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8dc0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8dd0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8de0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8df0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8e00: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8e10: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8e20: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8e30: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8e40: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8e50: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8e60: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8e70: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8e80: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8e90: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8ea0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8eb0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8ec0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8ed0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8ee0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8ef0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8f00: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8f10: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8f30: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8f40: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8f50: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8f60: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8f70: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8f80: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8f90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8fa0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8fb0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8fc0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8fd0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8fe0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8ff0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
9000: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
9010: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
9020: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
9030: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
9040: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
9050: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
9060: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
9070: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
9080: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
9090: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
90a0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
90b0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
90c0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
90d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
90e0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
90f0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
9100: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
9110: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
9120: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
9130: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
9140: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
9150: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
9160: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
9170: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
9180: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
9190: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
91a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
91b0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
91c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
91d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
91e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
91f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
9200: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9210: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
9220: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
9230: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
9240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9250: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
9260: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
9270: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
9280: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
9290: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
92a0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
92b0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
92c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
92d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
92e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
92f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
9300: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
9310: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
9320: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
9330: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9340: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
9350: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
9360: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
9370: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
9380: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
9390: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
93a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
93b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
93c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
93d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
93e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
93f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
9400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9410: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
9420: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
9430: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
9440: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
9450: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9460: 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20   macro USEFETCH 
9470: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9480: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65  e allowed to use
9490: 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20   the xFetch and 
94a0: 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65  xUnfetch.** inte
94b0: 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73  rfaces to access
94c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
94d0: 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  ing memory-mappe
94e0: 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51  d I/O..*/.#if SQ
94f0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
9500: 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53  ZE>0.# define US
9510: 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e  EFETCH(x) ((x)->
9520: 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65  bUseFetch).#else
9530: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9540: 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  CH(x) 0.#endif..
9550: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9560: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9570: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9580: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9590: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
95a0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
95b0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
95c0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
95d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
95e0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
95f0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
9600: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
9610: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
9620: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
9630: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
9640: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9650: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9660: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9670: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9680: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9690: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
96a0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
96b0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
96c0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
96d0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
96e0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
96f0: 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52  ods!=0)../*.** R
9700: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9710: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9720: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9730: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9740: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9750: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9760: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9780: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9790: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
97a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
97b0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
97c0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
97d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
97e0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
97f0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9800: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9810: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9820: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9830: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9840: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9850: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9860: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9870: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9880: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9890: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
98a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
98b0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
98c0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
98d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
98e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
98f0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9900: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9910: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9920: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9930: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9940: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9960: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9970: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9980: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9990: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
99a0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
99b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
99c0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
99f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a10: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9a40: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a60: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9a70: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a80: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9a90: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9aa0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ab0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9ac0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9ad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9ae0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9af0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9b00: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9b10: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9b20: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9b40: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9b50: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9b60: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9b70: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9b80: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9b90: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9ba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9bb0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9bd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9be0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9bf0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9c00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9c10: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9c20: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9c30: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9c40: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9c50: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9c60: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9c70: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9c80: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9c90: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9ca0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9cb0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9cc0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9cd0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9ce0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9d30: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9d40: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9d50: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9d60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9d70: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9d80: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9da0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9db0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9dc0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9dd0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9de0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9df0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9e00: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9e10: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9e30: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9e40: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9e50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9e60: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9e70: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9e80: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9e90: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9ea0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9eb0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9ec0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9ed0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9ee0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9ef0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9f00: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9f10: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9f20: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f60: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9f70: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9f80: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9f90: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fb0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9fc0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9fd0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ff0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
a000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
a010: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
a020: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
a030: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
a040: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
a050: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
a060: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
a070: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
a080: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
a090: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
a0a0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
a0b0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a0c0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a0d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
a0e0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
a0f0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
a110: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a150: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a160: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a170: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
a180: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
a190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1a0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
a1b0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
a1c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a1d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a1e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1f0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a200: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
a230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a240: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a250: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
a260: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a270: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a280: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a290: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a2a0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
a2c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a2d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a2e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a2f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a300: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a320: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a330: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a340: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a350: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a360: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a370: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a380: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a390: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a3a0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a3b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3c0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a3f0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a400: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a410: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a420: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a440: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a450: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a460: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a480: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a490: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a4a0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a4b0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a4c0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a4d0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a4e0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a500: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a510: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a520: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a530: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a540: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a550: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a560: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a580: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a590: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a5a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a5d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a5e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a5f0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a600: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a610: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a620: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a650: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a660: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a670: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a680: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a690: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a6a0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a6b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a6c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a6d0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a700: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a710: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a720: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a740: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a750: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a760: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a790: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a7a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a7b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a7c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a7d0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a7e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a7f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a800: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a820: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a830: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a840: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a850: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a860: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a870: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a880: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a890: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a8a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a8e0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a8f0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a900: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a910: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a920: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a930: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a940: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a950: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a960: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a970: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a980: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a9b0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a9c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a9d0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a9e0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a9f0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
aa00: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
aa10: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
aa20: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
aa30: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
aa40: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
aa50: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
aa60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
aa70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
aa80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
aa90: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
aaa0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
aab0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
aac0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
aad0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aae0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
aaf0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab00: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab10: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab30: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab40: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab50: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab60: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab70: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab80: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
ab90: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
aba0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abb0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abc0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abd0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abe0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
abf0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac00: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac10: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac20: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac30: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac40: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac50: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac60: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac70: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac80: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
ac90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
aca0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acb0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
acd0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
ace0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
acf0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad00: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad10: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad30: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad40: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad50: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad60: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad70: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad80: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ad90: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
ada0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adb0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
adc0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
add0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
ade0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
adf0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae00: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae10: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae20: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae40: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae50: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae60: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae70: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae80: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ae90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aea0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aeb0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aec0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aed0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aee0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
aef0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af00: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af10: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af20: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af30: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af40: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af60: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af70: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af80: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af90: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afa0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afb0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afc0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afd0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
afe0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aff0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b000: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b010: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b020: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b030: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b040: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b050: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b060: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b070: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b080: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b090: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0a0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0c0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0d0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0e0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b0f0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b100: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b120: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b130: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b140: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b150: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b160: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b170: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b180: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b190: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1b0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1c0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1f0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b200: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b210: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b220: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b230: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b240: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b250: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b270: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b280: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b290: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2a0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2b0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2c0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2d0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2e0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b2f0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b300: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b310: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b320: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b330: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b340: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b360: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b370: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b380: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b3a0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b3b0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b3c0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b3d0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b3e0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b3f0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b400: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b410: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b420: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b430: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b440: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b450: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b460: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b470: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b480: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b490: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b4a0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b4b0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b4d0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b4e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b4f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b500: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b510: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b520: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b530: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b540: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b550: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b560: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b570: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b580: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b590: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b5a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b5b0: 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53  tNotNull(p->pInS
b5c0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
b5d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b5e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b5f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b620: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b630: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b650: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b660: 49 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  InJournal(Pager 
b670: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
b680: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
b690: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
b6a0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
b6b0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
b6c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b6d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
b6e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b6f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b7a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b7b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b7c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b7d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7f0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b800: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b810: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b820: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b830: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b840: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b860: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b870: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b880: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b890: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b8a0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b8b0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b8c0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b8d0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b8e0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b8f0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b900: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b910: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b920: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b930: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b940: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b950: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b960: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b970: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b980: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b990: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b9a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b9b0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b9c0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b9d0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b9e0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b9f0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
ba00: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
ba10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ba20: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
ba30: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
ba40: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ba50: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
ba60: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
ba70: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ba80: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
ba90: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
baa0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
bab0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
bac0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
bad0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
bae0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
baf0: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
bb00: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
bb10: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
bb20: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bb30: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
bb60: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bb70: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
bb80: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bb90: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bba0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
bbb0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bbc0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
bbd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bbe0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
bbf0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
bc00: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
bc10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
bc20: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
bc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
bc40: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bc50: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
bc60: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
bc70: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
bc80: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
bc90: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
bca0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
bcb0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
bcc0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
bcd0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
bce0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bcf0: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
bd00: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
bd10: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
bd20: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bd30: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
bd40: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
bd50: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
bd60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
bd70: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bd80: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
bda0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
bdb0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bdc0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
bdd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bde0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
bdf0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
be00: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
be10: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
be20: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
be40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
be50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
be60: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
be70: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
be80: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
be90: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bea0: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
beb0: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bec0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bed0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bee0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bef0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
bf00: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
bf10: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
bf20: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
bf30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
bf40: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
bf50: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bf60: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
bf70: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
bf80: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
bf90: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bfa0: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
bfb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bfc0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
bfd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
bfe0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
bff0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c000: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
c010: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
c020: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
c030: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c040: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
c050: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
c060: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c070: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
c080: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
c090: 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   : sqlite3OsLock
c0a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c0b0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
c0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
c0d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
c0e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
c0f0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c100: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
c110: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c120: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
c130: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
c140: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c150: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
c160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c180: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
c190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c1a0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
c1b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
c1c0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
c1d0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
c1e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c1f0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
c200: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
c210: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c220: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c230: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
c240: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
c250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c260: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
c270: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
c280: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
c290: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
c2a0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
c2b0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
c2c0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
c2d0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
c2e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
c2f0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
c300: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
c310: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
c320: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
c330: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
c340: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
c350: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
c360: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
c370: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
c380: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
c390: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
c3a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
c3b0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
c3c0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
c3d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c3e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c400: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
c410: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
c420: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
c430: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
c440: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
c450: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
c460: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
c470: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
c480: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
c490: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
c4a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c4b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c4e0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c4f0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
c500: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c520: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
c530: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
c560: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
c570: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c580: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
c590: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
c5a0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
c5b0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
c5c0: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
c5d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
c5e0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
c5f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
c600: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c610: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
c620: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
c630: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c640: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
c650: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
c660: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
c670: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c680: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
c690: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
c6c0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
c6d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
c6e0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c6f0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
c700: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
c710: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
c720: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
c730: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
c740: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
c750: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
c760: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
c770: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
c780: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
c790: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c7b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
c7c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
c7d0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
c7e0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
c7f0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
c800: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
c810: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
c820: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c830: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c840: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c860: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c870: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c880: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c890: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c8a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c8b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c8c0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c8d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8e0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c8f0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c900: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c910: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c920: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c930: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c940: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c950: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c960: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c970: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c980: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c990: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c9a0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c9b0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c9c0: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c9d0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c9e0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c9f0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
ca00: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
ca10: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ca20: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
ca30: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
ca40: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
ca50: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
ca60: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
ca70: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
ca80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ca90: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
caa0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cab0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cad0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
cae0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
caf0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
cb00: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
cb10: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
cb20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cb30: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
cb40: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
cb50: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cb60: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
cb70: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cb80: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
cb90: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cba0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cbb0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cbc0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cbe0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cbf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
cc00: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
cc10: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cc30: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
cc40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cc50: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cc60: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cc70: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cc80: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cc90: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cca0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
ccb0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
ccc0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
ccd0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
cce0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
ccf0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
cd00: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
cd20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
cd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
cd40: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
cd50: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
cd60: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
cd70: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
cd80: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
cd90: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
cda0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
cdb0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
cdc0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
cdd0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
cde0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
cdf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce00: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
ce10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ce20: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
ce30: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
ce40: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
ce50: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
ce60: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
ce70: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
ce80: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
ce90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cea0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
ceb0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
cec0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
ced0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cee0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cef0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
cf00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
cf10: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
cf20: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
cf30: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
cf40: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
cf50: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cf60: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
cf70: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
cf80: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
cf90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
cfa0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
cfb0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
cfc0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
cfd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cfe0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cff0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d000: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d010: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d020: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d030: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d040: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d050: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d060: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d080: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d090: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d0a0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d0b0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d0c0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d0d0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d0e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d0f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d100: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d110: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d120: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d130: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d150: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d180: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d190: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d1a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1c0: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d1d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d1e0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d210: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d220: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d230: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d240: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d250: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d260: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d270: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d280: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d290: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d2a0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d2b0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d2c0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d2d0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d2e0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d2f0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d300: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d310: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d320: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d330: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d340: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d350: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d360: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d370: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d380: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d390: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d3a0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d3b0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d3c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d3d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d3e0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d3f0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d400: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d410: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d420: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d430: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d450: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d460: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d470: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d480: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d490: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d4a0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d4b0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d4c0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d4d0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d4e0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d4f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d500: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d510: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d520: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d530: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d540: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d550: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d560: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d570: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d580: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d590: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d5a0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d5b0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d5c0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d5f0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d600: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d610: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d620: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d630: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d650: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d660: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d670: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d680: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d690: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d6a0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d6b0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d6c0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d6d0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d730: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d740: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d750: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d760: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d770: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d790: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d7a0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d7b0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d7c0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d7d0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d7e0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d7f0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d800: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d810: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d820: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d830: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d860: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d870: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d880: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d8a0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d8b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d8c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d8d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d8f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d900: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d910: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d930: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d950: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d960: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d970: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d980: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d990: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d9a0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d9b0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d9c0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d9d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d9e0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d9f0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
da00: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
da20: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
da30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
da40: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
da50: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
da60: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
da70: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
da80: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
da90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
daa0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
dab0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
dac0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
dad0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
dae0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
daf0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
db00: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
db10: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
db20: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
db30: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
db40: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
db50: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
db60: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
db70: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
db80: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
db90: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dba0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
dbb0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
dbc0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
dbd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
dbe0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
dbf0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
dc00: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
dc10: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
dc20: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
dc30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dc40: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
dc50: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dc60: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dc70: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dc80: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dc90: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dca0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dcb0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
dcc0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
dcd0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
dce0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
dcf0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
dd00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
dd40: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
dd50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
dd60: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a  ssert( !sqlite3J
dd70: 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
dd80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
dd90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
dda0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
ddb0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
ddc0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
ddd0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
dde0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
ddf0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
de00: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
de10: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
de20: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
de30: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
de40: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
de50: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
de60: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
de90: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
dea0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
deb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
dec0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ded0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
dee0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
def0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
df00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
df10: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
df20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df30: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
df40: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
df50: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
df60: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
df70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
df80: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
dfa0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
dfb0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
dfc0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
dfd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
dfe0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
dff0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
e000: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
e010: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
e020: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
e030: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
e040: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
e050: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
e060: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
e070: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
e080: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
e090: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
e0a0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
e0b0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
e0c0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
e0d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
e0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e0f0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
e100: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
e110: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e120: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
e130: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
e140: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e150: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
e160: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e170: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e180: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
e190: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
e1a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e1b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
e1c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
e1d0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
e1e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e1f0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
e200: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
e210: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
e220: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
e230: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
e240: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
e250: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
e260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
e270: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
e280: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
e290: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
e2a0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
e2b0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
e2c0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
e2d0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
e2e0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
e2f0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
e300: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
e310: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
e320: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
e330: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
e340: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
e350: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
e360: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
e370: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
e380: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
e390: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
e3a0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
e3b0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
e3c0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
e3d0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
e3e0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
e3f0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
e400: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e420: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
e430: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e450: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e460: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e470: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
e480: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
e490: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
e4a0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
e4b0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
e4c0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e4d0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
e4e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
e4f0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e500: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e510: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
e520: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
e550: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
e560: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e590: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e5a0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e5b0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
e5c0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
e5d0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e5e0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
e5f0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e600: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e610: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e630: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e640: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e650: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e660: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e670: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e680: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e690: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e6a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e6b0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e6c0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e6d0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e6e0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e6f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e700: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e710: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e720: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e730: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e740: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e750: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e760: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e770: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e780: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e790: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e7a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e7b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e7c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e7d0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e7e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e7f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e800: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e810: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e820: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e830: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e840: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e850: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e860: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e870: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e880: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e890: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e8a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e8b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e8c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e8d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e8e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e8f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e900: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e910: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e920: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e930: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e940: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e950: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e960: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e970: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e980: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e990: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e9a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e9b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e9c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e9d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e9e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e9f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
ea00: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
ea10: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
ea20: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
ea30: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
ea40: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
ea50: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
ea60: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
ea70: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
ea80: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
ea90: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
eaa0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
eab0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
eac0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
ead0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
eae0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
eaf0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
eb00: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
eb10: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
eb20: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
eb30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
eb40: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
eb50: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
eb60: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
eb70: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
eb80: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
eb90: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
eba0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
ebb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
ebc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
ebd0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
ebe0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
ebf0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
ec00: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
ec10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ec20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ec30: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
ec40: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ec50: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ec60: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
ec70: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
ec80: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
ec90: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
eca0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
ecb0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ecc0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
ecd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
ece0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ecf0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
ed00: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
ed10: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
ed20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
ed30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
ed40: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
ed50: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
ed60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
ed70: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
ed80: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
ed90: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
eda0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
edb0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
edc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
edd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ede0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
edf0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
ee00: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
ee10: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ee20: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ee30: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ee40: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
ee50: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
ee60: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
ee70: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
ee80: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
ee90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eea0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eeb0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
eec0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
eed0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
eee0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
eef0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ef00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ef10: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
ef20: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
ef30: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
ef40: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
ef50: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
ef60: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
ef70: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
ef80: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
ef90: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
efa0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
efb0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
efc0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
efd0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
efe0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
eff0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
f000: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
f010: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
f020: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
f030: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
f040: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f050: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
f060: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
f070: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f080: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
f090: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
f0a0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
f0b0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
f0c0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
f0d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
f0e0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
f0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f100: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
f110: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
f120: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f130: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
f140: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
f150: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
f160: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
f170: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
f180: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
f190: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
f1a0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
f1b0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
f1c0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
f1d0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
f1e0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
f1f0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
f200: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
f210: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
f220: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
f230: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
f240: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
f250: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
f260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
f270: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
f280: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
f290: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
f2a0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
f2b0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
f2c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
f2d0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
f2e0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
f2f0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
f300: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
f310: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
f320: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
f330: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
f340: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
f350: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
f360: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
f370: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
f380: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
f390: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
f3a0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
f3b0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
f3c0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
f3d0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
f3e0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
f3f0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
f400: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
f410: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
f420: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
f430: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
f440: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
f450: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f460: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
f470: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
f480: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
f490: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
f4a0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f4b0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
f4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
f4e0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
f4f0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
f500: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
f510: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f520: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
f530: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f540: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f550: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
f560: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
f570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f580: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
f590: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
f5a0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
f5b0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
f5c0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
f5f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f600: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f610: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f620: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f630: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f640: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f650: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f660: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f670: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f680: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f690: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f6a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f6b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f6c0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f6d0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f6e0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f6f0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f700: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f710: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f720: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f730: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f740: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f750: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f760: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f770: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f780: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f790: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f7a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f7b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f7c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f7d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f7e0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f7f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f800: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f810: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f820: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f830: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f840: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f850: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f860: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f870: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f880: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f890: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f8a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f8b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f8c0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8f0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f900: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f920: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f930: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f940: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f960: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f970: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f980: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f990: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f9b0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f9c0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f9d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f9e0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f9f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
fa00: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
fa10: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
fa20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fa50: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
fa60: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
fa70: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
fa80: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
fa90: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
faa0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fac0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
fad0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
fae0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
faf0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
fb00: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
fb10: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
fb20: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
fb30: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
fb40: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
fb50: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fb60: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
fb70: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
fb80: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
fb90: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
fba0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
fbb0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
fbc0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
fbd0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
fbe0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
fbf0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
fc00: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
fc10: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
fc20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
fc30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fc40: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
fc50: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
fc60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
fc70: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
fc80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
fc90: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
fca0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
fcb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcc0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
fcd0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
fce0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
fcf0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
fd00: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
fd10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
fd20: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
fd30: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
fd40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
fd50: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fd60: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
fd70: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
fd80: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
fd90: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
fda0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
fdb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fdc0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
fdd0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
fde0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
fdf0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
fe00: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fe10: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
fe20: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
fe30: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
fe40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fe50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
fe60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fe70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fe80: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
fe90: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
fea0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
feb0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
fec0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
fed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
fee0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
fef0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
ff00: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
ff10: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
ff20: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
ff30: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
ff40: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
ff50: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
ff60: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff70: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff80: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
ff90: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
ffa0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffb0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffc0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffd0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
ffe0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
fff0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10000 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10010 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10020 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
10030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10040 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
10050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10060 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
10070 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
10080 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
10090 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
100a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
100b0 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
100c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
100d0 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
100e0 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
100f0 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
10100 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
10110 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10120 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
10130 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
10140 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
10150 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10160 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10170 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
10180 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
10190 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
101a0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
101b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
101c0 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
101d0 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
101e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
101f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
10200 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
10210 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
10220 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
10230 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
10240 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
10250 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
10260 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
10270 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
10280 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
10290 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
102a0 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
102b0 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
102c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
102d0 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
102e0 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
102f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
10300 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
10310 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
10320 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
10330 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
10340 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10350 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
10360 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
10370 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
10380 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
10390 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
103a0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
103b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
103c0 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
103d0 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
103e0 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
103f0 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
10400 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
10410 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
10420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10430 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10450 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
10460 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
10470 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
10480 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
10490 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
104a0 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
104b0 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
104c0 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
104d0 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
104e0 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
104f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
10500 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
10510 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
10520 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
10530 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10540 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
10550 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
10560 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
10570 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
10580 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
10590 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
105a0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
105b0 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
105c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
105d0 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
105e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
105f0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10600 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10610 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10630 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10640 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10650 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10660 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10670 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10680 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10690 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
106a0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
106b0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
106c0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
106d0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
106e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
106f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10700 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10710 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10720 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10730 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10740 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10750 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10760 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10770 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10780 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10790 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
107a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
107b0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
107c0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
107d0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
107e0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
107f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10800 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10810 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10820 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10830 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10840 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10850 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10860 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10870 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10880 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10890 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
108a0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
108b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
108c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
108d0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
108e0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
108f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10900 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10910 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10920 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10940 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10950 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10960 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10970 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10980 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10990 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
109a0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
109b0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
109c0 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
109d0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
109e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
109f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10a00 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10a10 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10a20 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10a30 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10a40 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10a50 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10a60 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10a70 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10a80 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10a90 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10aa0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10ab0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10ac0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10ad0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10ae0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10af0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10b00 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10b10 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10b20 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10b30 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10b40 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10b50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10b60 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10b70 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10b80 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10b90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10ba0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10bb0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10bc0 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10bd0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10be0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10bf0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10c00 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10c10 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10c20 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10c30 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10c40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10c50 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10c60 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10c70 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10c80 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10c90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10cc0 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10cf0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10d00 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10d30 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10d40 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10d50 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10d80 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10d90 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10db0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10dc0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10dd0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10de0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10df0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10e00 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10e10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10e20 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10e50 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10e60 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50     || !isOpen(pP
10e70 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a  ager->jfd).  ){.
10e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10ea0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10eb0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  1;.  assert( pPa
10ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10ed0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10ee0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10ef0 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10f00 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10f10 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10f20 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10f30 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10f40 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10f50 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10f60 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10f70 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10f80 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10f90 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10fa0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10fb0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10fc0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10fd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10fe0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10ff0 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
11000 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
11010 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
11020 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
11030 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
11040 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11050 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
11060 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11070 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
11080 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
11090 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
110a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110b0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
110c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
110d0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
110e0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
110f0 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
11100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11110 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
11120 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
11130 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
11140 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11150 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
11160 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
11170 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
11180 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
11190 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
111a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
111b0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
111c0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
111d0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
111e0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
111f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11200 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11210 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
11220 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11230 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11240 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11250 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
11260 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
11270 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11280 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11290 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
112a0 69 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20  ic, 8,.         
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b          iHdrOff+
112d0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
112e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
112f0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
11300 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
11310 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
11320 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11330 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
11340 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
11350 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
11360 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
11370 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
11380 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
11390 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
113a0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
113b0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
113c0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
113d0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
113e0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
113f0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
11400 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
11410 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11420 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
11430 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
11440 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
11450 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
11460 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11470 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11480 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
11490 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
114a0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
114b0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
114c0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
114d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
114e0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
114f0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
11500 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
11510 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11520 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11530 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11540 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11550 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11560 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11580 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11590 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
115a0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
115b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
115c0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
115d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
115e0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
115f0 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11610 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
11620 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
11630 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
11640 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  +;.  sqlite3Back
11650 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
11660 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
11670 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
11680 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11690 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
116a0 72 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69  rn the pPager->i
116b0 44 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75  DataVersion valu
116c0 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  e.*/.u32 sqlite3
116d0 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
116e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
116f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11700 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
11710 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e  OPEN );.  return
11720 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11730 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11740 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11750 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11760 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11770 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11780 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11790 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
117a0 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
117b0 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
117c0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
117d0 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
117e0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
117f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11810 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11820 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11830 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11850 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
11860 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11870 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11880 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11890 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
118a0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
118b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
118c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
118d0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
118e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
118f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11900 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
11910 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
11920 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
11930 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11940 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11950 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11970 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11980 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11990 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
119a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
119b0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
119c0 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
119d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
119e0 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
119f0 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11a00 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11a10 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11a20 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11a30 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11a40 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11a50 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11a60 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11a70 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11a80 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11a90 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11aa0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11ab0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11ac0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ae0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11af0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11b00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11b10 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11b20 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11b30 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11b40 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11b50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11b60 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11b70 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11b80 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11b90 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11ba0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11bb0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11bc0 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11bd0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11c10 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11c50 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11c60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11c70 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11c80 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11c90 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11ca0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11cb0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11cc0 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11cd0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11ce0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11cf0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11d00 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11d10 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11d20 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11d30 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11d40 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11d50 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11d60 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11d70 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11d80 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11d90 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11da0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11db0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11dc0 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11dd0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11de0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11df0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11e00 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11e10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11e20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11e30 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11e40 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11e50 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11e60 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11e70 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11e90 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11ea0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11ec0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11ed0 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11ee0 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11ef0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11f00 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11f10 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11f20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11f30 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11f40 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11f50 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11f60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11f70 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11f80 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11f90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11fa0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11fb0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11fc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11fd0 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11fe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ff0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12000 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
12010 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
12020 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
12030 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
12040 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
12050 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
12060 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12070 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12080 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12090 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
120a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
120b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
120c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
120d0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
120e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
120f0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12100 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
12110 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12120 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
12150 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
12160 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12170 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12190 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
121a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
121b0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
121c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
121d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
121e0 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
121f0 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12200 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
12210 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
12220 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
12230 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
12240 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
12250 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
12260 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12270 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12280 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12290 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
122a0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
122b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
122c0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
122d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
122e0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
122f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12300 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12310 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12320 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12330 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12340 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12360 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12370 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12380 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12390 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
123a0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
123b0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
123c0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
123d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
123e0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
123f0 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12400 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12410 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12420 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12440 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12450 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12460 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12480 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12490 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
124a0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
124b0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
124c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
124d0 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
124e0 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
124f0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12500 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12510 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12520 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12530 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12540 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12550 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
12560 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12570 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12580 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12590 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
125a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
125b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
125c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
125d0 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
125e0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
125f0 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12600 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12610 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12620 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12630 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12640 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12650 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
12660 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12670 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12680 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12690 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
126a0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
126b0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
126c0 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
126d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
126e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
126f0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12700 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12710 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12720 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12730 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12740 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12750 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12760 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12770 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12780 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12790 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
127a0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
127b0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
127c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
127d0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
127e0 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
127f0 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12800 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12810 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12820 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12830 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12840 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12850 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12860 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12870 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12880 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12890 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
128a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
128b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
128c0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
128d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
128e0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
128f0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12900 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12920 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12930 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12940 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12950 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12960 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12970 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12990 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
129a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
129b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
129c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
129d0 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
129e0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
129f0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12a00 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12a10 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12a20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12a30 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12a40 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12a50 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12a60 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12a70 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12a80 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12a90 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12aa0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12ab0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12ac0 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12ad0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12ae0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12af0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12b20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12b30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12b40 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12b50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12b60 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12b70 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12b80 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12b90 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12ba0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12bb0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12bc0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12bd0 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12be0 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12bf0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12c00 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12c10 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12c20 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12c30 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12c40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12c50 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12c60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12c70 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12c80 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12c90 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12ca0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12cb0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12cc0 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12cd0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12ce0 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12d00 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12d10 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12d20 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12d30 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12d40 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12d50 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12d60 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12d70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12d90 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12da0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12dc0 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12dd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12de0 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12df0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12e00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12e10 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12e20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12e50 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12e60 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12e70 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12e80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12e90 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12ea0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12eb0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12ec0 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12ed0 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12ee0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12ef0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12f00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12f10 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12f20 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12f30 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12f40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12f50 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12f60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12f70 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12f80 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12f90 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12fa0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12fb0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12fc0 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12fd0 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12fe0 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12ff0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13000 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13010 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13020 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13030 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13050 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13060 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13070 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13080 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13090 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
130a0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
130b0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
130c0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
130d0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
130e0 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
130f0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13100 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13110 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13120 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13130 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13140 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13150 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13160 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13170 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13180 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
131a0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
131b0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
131c0 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
131d0 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
131e0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
131f0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13200 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13210 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13220 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13230 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13240 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13250 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13260 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13270 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13280 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13290 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
132a0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
132b0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
132c0 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
132d0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132e0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
132f0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13300 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13310 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13320 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13330 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13340 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13350 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13360 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13370 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13380 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13390 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
133a0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
133b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
133c0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
133d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
133e0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
133f0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13400 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13410 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13420 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13430 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13440 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13450 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13460 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13470 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13480 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13490 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
134a0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
134b0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
134c0 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
134d0 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
134e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
134f0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13500 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13510 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13520 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13530 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13540 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13550 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13560 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13570 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13580 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13590 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
135a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
135b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
135c0 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
135d0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
135e0 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
135f0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13600 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13610 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13620 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13630 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13640 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13650 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13660 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13670 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13680 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13690 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
136a0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
136b0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
136c0 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
136d0 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
136e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
136f0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13700 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13710 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13720 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13730 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13740 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13750 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13760 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13770 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13780 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13790 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
137a0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
137b0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
137c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
137d0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
137e0 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
137f0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13800 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13810 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13820 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13830 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13840 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13850 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13860 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13870 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13880 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13890 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
138a0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
138b0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
138c0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
138d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
138e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
138f0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13900 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13910 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13920 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13930 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13940 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13950 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13970 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13980 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13990 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
139a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
139b0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
139c0 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
139d0 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
139e0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
139f0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13a00 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13a10 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13a20 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13a30 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13a40 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13a50 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13a60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13a70 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13a80 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13a90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13aa0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13ab0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13ac0 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13ad0 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13ae0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13af0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13b00 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13b20 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13b30 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13b40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13b50 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13b60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13b70 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13b80 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13b90 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13ba0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13bb0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13bc0 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13bd0 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13be0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13bf0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13c00 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13c10 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13c20 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13c30 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13c40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13c50 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13c60 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13c70 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13c80 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13c90 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13ca0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13cb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13cc0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13ce0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13cf0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13d00 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13d10 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13d20 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13d30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13d60 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13d70 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13d80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13d90 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13da0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13db0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13dc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13de0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13df0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13e00 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13e10 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13e20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
13e30 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
13e40 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13e50 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
13e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13e70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13e80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
13e90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13ea0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13eb0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
13ec0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13ed0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13ee0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13ef0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
13f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13f40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13f50 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
13f60 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13f70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13f80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
13f90 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
13fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
13fb0 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
13fc0 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
13fd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
13fe0 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
13ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
14000 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
14010 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
14020 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
14030 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
14040 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
14050 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
14060 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
14070 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
14080 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
14090 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
140a0 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
140b0 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
140c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
140d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
140e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
140f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
14100 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
14110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14130 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14140 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14150 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14160 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14170 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
14180 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14190 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
141a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
141b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
141c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
141d0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
141e0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
141f0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ter);.      pPag
14200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14220 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14230 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14240 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14250 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14260 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14280 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14290 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
142a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
142b0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
142c0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
142d0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
142e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
142f0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14310 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14320 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14330 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14340 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14350 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14360 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14380 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14390 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
143a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
143b0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
143c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
143d0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
143e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
143f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14400 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14410 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
14420 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14440 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14450 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
14460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
14470 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14480 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14490 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
144a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
144b0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
144c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
144d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
144e0 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
144f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14500 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14510 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
14520 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
14530 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
14540 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
14550 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
14560 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
14570 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14580 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14590 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
145a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
145b0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
145c0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
145d0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
145e0 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
145f0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14600 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14610 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
14620 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
14630 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
14640 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14650 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
14660 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14670 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14680 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
14690 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
146a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
146b0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
146c0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
146d0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
146e0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
146f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14700 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14710 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14720 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14730 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14740 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14750 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
14770 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
14780 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
14790 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
147a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
147b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
147c0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
147d0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
147e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
147f0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14800 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14810 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14830 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14840 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14850 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14860 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14870 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14880 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
14890 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
148a0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
148b0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
148c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
148d0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
148e0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
148f0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14900 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14910 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14920 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14930 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14940 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14950 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14960 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
14980 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
14990 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
149a0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
149b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
149c0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
149d0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
149e0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
149f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14a00 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14a10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14a20 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14a30 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14a40 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14a50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
14a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
14a70 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
14a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
14a90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14aa0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
14ab0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
14ac0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
14ad0 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
14ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14af0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
14b00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14b10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14b20 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
14b30 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14b40 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
14b50 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
14b60 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
14b70 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
14b80 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
14b90 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
14ba0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
14bb0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14bc0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14bd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14be0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14bf0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14c00 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14c10 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14c20 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14c30 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14c40 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14c50 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14c60 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14c80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14c90 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14ca0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14cb0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14cc0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14cd0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14ce0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14cf0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14d00 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14d10 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14d20 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14d30 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14d40 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14d50 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14d60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14d70 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14d80 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14d90 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14da0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14db0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14dc0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14dd0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14de0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14df0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14e00 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14e10 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14e20 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14e30 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14e40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14e50 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14e60 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14e70 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14e80 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14e90 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14ea0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14eb0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14ec0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14ed0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14ee0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14ef0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14f00 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14f10 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14f20 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14f30 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14f40 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14f50 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14f60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14f80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14f90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14fa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14fb0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14fc0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14fd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14fe0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15000 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15010 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15020 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15030 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15040 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15050 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15060 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15070 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15080 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15090 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
150a0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
150b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
150c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
150d0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
150e0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
150f0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15100 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15110 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15130 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15140 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15150 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15160 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15170 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15180 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15190 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
151a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
151b0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
151c0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
151d0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
151e0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
151f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15200 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15210 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15220 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15230 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15240 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15250 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15260 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15270 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15280 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15290 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
152a0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
152b0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
152c0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
152d0 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
152e0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
152f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15300 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15310 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15320 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15330 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15340 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15350 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15360 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15370 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15380 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15390 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
153a0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
153b0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
153c0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
153d0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
153e0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
153f0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15400 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15410 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15420 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15430 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15440 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15450 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15460 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15470 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15480 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15490 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
154a0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
154b0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
154c0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
154d0 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
154e0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
154f0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15500 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15510 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15520 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15530 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15540 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
15550 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
15560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
15570 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
15580 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15590 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
155a0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
155b0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
155c0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
155d0 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
155e0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
155f0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15600 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15610 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15620 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15630 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15640 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
15650 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
15660 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
15670 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15680 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15690 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
156a0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
156b0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
156c0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
156d0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15700 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15720 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15730 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15740 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
15750 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
15760 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15770 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
15780 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15790 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
157a0 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
157b0 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
157c0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
157d0 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
157e0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
157f0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
15800 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
15810 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
15820 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
15830 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
15840 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
15850 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
15860 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
15870 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
15880 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
15890 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
158a0 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
158b0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
158c0 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
158d0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
158e0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
158f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
15900 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
15910 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
15920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15930 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
15940 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
15950 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15960 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
15970 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
15980 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
15990 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
159a0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
159b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
159c0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
159d0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
159e0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
159f0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
15a00 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
15a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
15a20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15a30 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
15a40 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
15a50 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
15a60 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
15a70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15a80 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
15a90 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
15aa0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15ab0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
15ac0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
15ad0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
15ae0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
15af0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
15b00 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
15b10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
15b20 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
15b30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
15b40 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
15b50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
15b60 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
15b70 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
15b80 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
15b90 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
15ba0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15bb0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
15bc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
15bd0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
15be0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
15bf0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
15c00 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
15c10 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
15c20 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
15c30 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
15c40 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
15c50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
15c60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
15c70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15c80 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15c90 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15ca0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
15cb0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
15cc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
15cd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
15ce0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
15cf0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
15d00 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
15d20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
15d30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15d40 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
15d50 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
15d60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
15d70 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
15d80 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15d90 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15da0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
15db0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
15dc0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
15dd0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
15de0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
15df0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
15e00 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
15e10 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
15e20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
15e30 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
15e40 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
15e50 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
15e60 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15e70 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
15e80 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
15e90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15ea0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
15eb0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
15ec0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
15ed0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
15ee0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
15ef0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
15f00 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
15f10 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
15f20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15f30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
15f40 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
15f50 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15f60 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
15f70 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
15f80 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
15f90 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
15fa0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15fb0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
15fc0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
15fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
15fe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15ff0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16000 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16010 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16020 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16030 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16040 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16050 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16060 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16070 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16080 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16090 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
160a0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
160b0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
160c0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
160d0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
160e0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
160f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16100 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16110 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16120 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16130 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16150 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16160 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16180 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
161b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
161c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
161f0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16200 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16210 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16230 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16240 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16250 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16260 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16270 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16280 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16290 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
162a0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
162b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
162c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
162d0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
162e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
162f0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16310 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16320 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
16330 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
16340 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
16350 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
16360 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
16370 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
16380 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
16390 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
163a0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
163b0 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
163c0 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
163d0 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
163e0 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
163f0 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
16400 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
16410 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
16420 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
16430 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
16440 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
16450 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
16460 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
16470 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
16480 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
16490 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
164a0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
164b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
164c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
164d0 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
164e0 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
164f0 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  t) );..  /* Eith
16500 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20  er the state is 
16510 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47  greater than PAG
16520 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16530 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f  OD (a transactio
16540 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  n .  ** or savep
16550 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f  oint rollback do
16560 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73  ne at the reques
16570 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29  t of the caller)
16580 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   or this is.  **
16590 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
165a0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69  ollback. If it i
165b0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
165c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61  rollback, the pa
165d0 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73  ger.  ** is in s
165e0 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f  tate OPEN and ho
165f0 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  lds an EXCLUSIVE
16600 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e   lock. Hot-journ
16610 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  al rollback.  **
16620 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d   only reads from
16630 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16640 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a  l, not the sub-j
16650 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
16660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
16670 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16680 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
16690 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
166a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
166b0 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  EN && pPager->eL
166c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
166d0 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65  OCK).  );.  asse
166e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
166f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16700 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d  _CACHEMOD || isM
16710 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a  ainJrnl );..  /*
16720 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
16730 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
16740 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
16750 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
16760 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
16770 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
16780 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
16790 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
167a0 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
167b0 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
167c0 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
167d0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
167e0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
167f0 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
16800 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
16810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16820 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
16830 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
16840 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
16850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16860 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
16870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16880 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16890 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
168a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
168b0 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
168c0 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
168d0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
168e0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
168f0 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
16900 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
16910 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
16920 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
16930 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
16940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
16950 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
16960 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
16970 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
16980 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16990 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
169a0 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
169b0 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
169c0 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
169d0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
169e0 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
169f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16a00 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
16a10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
16a20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
16a30 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
16a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a50 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
16a60 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
16a70 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
16a80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
16a90 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
16aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16ab0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16ac0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16ad0 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16ae0 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
16af0 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
16b00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16b10 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
16b20 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
16b30 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
16b40 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
16b50 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16b80 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
16b90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16ba0 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65  ayed back before
16bb0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16bc0 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16bd0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16be0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16bf0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16c00 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16c10 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16c20 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16c30 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16c60 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16c70 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16c80 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16c90 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16ca0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16cb0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16cc0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16cd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16ce0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16cf0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16d00 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16d10 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16d20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16d30 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16d40 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16d50 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16d60 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16d70 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16d80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16d90 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16da0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16db0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16dc0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16dd0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16de0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16df0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16e00 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16e10 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16e30 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16e40 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16e50 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16e60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16e70 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16e80 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16e90 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16ea0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16eb0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16ec0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16ed0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16ee0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16ef0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16f00 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16f10 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16f20 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16f30 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16f40 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16f50 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16f60 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16f70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16f80 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16f90 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16fa0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16fb0 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16fc0 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16fd0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16fe0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16ff0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
17000 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
17010 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
17020 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
17030 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
17040 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
17050 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
17060 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
17070 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
17080 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
17090 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
170a0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
170b0 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
170c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
170d0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
170e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
170f0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
17100 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
17110 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
17120 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
17130 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
17140 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
17150 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
17160 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
17170 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
17180 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
17190 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
171a0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
171b0 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
171c0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
171d0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
171e0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
171f0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
17200 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
17210 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
17220 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
17230 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
17240 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
17250 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
17260 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
17270 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
17280 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
17290 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
172a0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
172b0 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
172c0 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
172d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
172e0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
172f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
17300 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
17310 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
17320 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
17330 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
17340 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
17350 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
17360 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
17370 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17380 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
17390 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
173a0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
173b0 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
173c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
173d0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
173e0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
173f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17400 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
17410 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17420 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
17430 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
17440 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
17450 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
17460 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
17470 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
17480 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
17490 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
174a0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
174b0 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
174c0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
174d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
174e0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
174f0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
17500 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
17510 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
17520 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
17530 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
17540 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
17550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
17560 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
17570 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
17580 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
17590 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
175a0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
175b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
175c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
175d0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
175e0 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
175f0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
17600 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17610 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17630 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17640 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17650 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17660 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17680 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17690 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
176a0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
176b0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
176c0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
176d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
176e0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
176f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17700 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17710 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17720 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17730 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17740 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17750 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17760 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17770 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17780 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17790 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
177a0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
177b0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
177c0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
177d0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
177e0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
177f0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17800 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17810 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17820 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17830 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17840 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17850 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17870 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17880 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17890 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
178a0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
178b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
178c0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
178d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
178e0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
178f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17900 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17910 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17920 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17930 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17940 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
17950 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17960 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17970 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
17980 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
17990 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
179a0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
179b0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
179c0 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  KPT, aData);.   
179d0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
179e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
179f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17a00 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17a10 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17a20 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17a30 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17a40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17a50 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
17a60 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
17a70 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
17a80 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
17a90 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
17aa0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
17ab0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17ac0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17ad0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17ae0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17af0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17b00 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17b10 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17b20 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17b30 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17b40 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
17b50 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
17b60 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
17b70 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
17b80 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
17b90 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
17ba0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
17bb0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17bc0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17bd0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17be0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17bf0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17c00 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17c10 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17c20 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17c30 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17c40 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17c50 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
17c60 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
17c70 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
17c80 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
17c90 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
17ca0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
17cb0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17cc0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17cd0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17ce0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17cf0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17d00 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17d10 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17d20 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17d30 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17d40 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17d50 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
17d60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
17d70 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
17d80 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17d90 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17da0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17db0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17dc0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17dd0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17de0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17df0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17e00 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
17e10 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
17e20 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
17e30 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
17e40 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
17e50 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
17e60 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
17e70 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17e80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17e90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17ea0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
17eb0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
17ec0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
17ed0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
17ee0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17ef0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17f00 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17f10 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17f20 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17f30 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17f40 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17f50 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17f60 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17f70 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17f80 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
17f90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
17fa0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
17fb0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
17fc0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
17fd0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
17fe0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17ff0 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18000 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18010 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18020 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18030 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18040 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18050 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18060 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18070 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18080 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18090 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
180a0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
180b0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
180c0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
180d0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
180e0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
180f0 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
18100 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
18110 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
18120 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
18130 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
18140 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
18150 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18160 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
18170 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
18180 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
18190 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
181a0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
181b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
181c0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
181d0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
181e0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
181f0 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
18200 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
18210 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
18220 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
18230 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18240 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
18250 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
18260 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
18270 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
18280 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
18290 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
182a0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
182b0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
182c0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
182d0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
182e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
182f0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
18300 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
18310 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
18320 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
18330 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
18340 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
18350 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
18360 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
18370 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18380 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
18390 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
183a0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
183b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
183c0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
183d0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
183e0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
183f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18400 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
18410 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
18420 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
18430 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
18440 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
18450 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
18460 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
18470 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
18480 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
18490 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
184a0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
184b0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
184c0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
184d0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
184e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
184f0 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
18500 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
18510 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
18520 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
18530 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
18540 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
18550 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
18560 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
18570 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
18580 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
18590 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
185a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
185b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
185c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
185d0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
185e0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
185f0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
18600 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
18610 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
18620 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
18630 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
18640 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
18650 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
18660 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
18670 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
18680 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
18690 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
186a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
186b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
186c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
186d0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
186e0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
186f0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
18700 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18710 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
18720 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18730 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18740 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18770 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18780 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
187a0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
187b0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
187c0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
187d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187e0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
187f0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18810 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18820 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
18830 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18840 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18850 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18860 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18870 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18880 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18890 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
188a0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
188b0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
188c0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
188d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
188e0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
188f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18900 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18910 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18920 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18930 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18940 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18950 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18960 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18970 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18980 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18990 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
189a0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
189b0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
189c0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
189d0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
189e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
189f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18a00 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18a20 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18a30 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18a40 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18a50 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18a60 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18a70 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18a80 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18a90 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18aa0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18ab0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18ac0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18ad0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18ae0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18b00 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18b10 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18b30 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18b40 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18b50 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18b70 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18b80 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18b90 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18ba0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18bb0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18bc0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18bd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18be0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18bf0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18c00 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18c10 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18c20 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18c30 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18c40 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18c50 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18c60 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18c70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18c80 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18c90 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18ca0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18cb0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18cc0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18cd0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18ce0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18cf0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18d00 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18d10 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18d20 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18d30 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18d40 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18d50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18d60 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18d70 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18d80 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18d90 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18da0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
18db0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
18dc0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18dd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18de0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18df0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18e00 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18e10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18e20 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18e30 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18e40 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18e50 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18e60 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18e70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18e80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18e90 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18ea0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18eb0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18ec0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18ed0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18ee0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18f00 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18f10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18f20 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18f30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18f40 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18f50 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18f80 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18f90 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18fa0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18fb0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18fc0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18fe0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18ff0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
19000 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19010 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
19020 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19030 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
19040 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
19050 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
19060 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
19070 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19080 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19090 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
190a0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
190b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
190c0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
190d0 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
190e0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
190f0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
19100 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
19110 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
19120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19130 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
19140 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
19150 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
19160 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
19170 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
19180 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19190 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
191a0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
191b0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
191c0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
191d0 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
191e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
191f0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19200 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19210 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19220 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
19230 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19240 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19250 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19260 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19270 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19280 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19290 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
192a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
192b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
192c0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
192d0 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
192e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
192f0 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
19300 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
19310 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
19320 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
19330 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
19340 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
19350 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19360 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
19370 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
19380 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19390 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
193a0 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
193b0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
193c0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
193d0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
193e0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
193f0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
19400 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
19410 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
19420 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  .  ** sqlite3_ma
19430 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
19440 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
19450 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20  Journal.   Also 
19460 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66  obtain.  ** suff
19470 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e  icient space (in
19480 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20   zMasterPtr) to 
19490 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f  hold the names o
194a0 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f  f master.  ** jo
194b0 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72  urnal files extr
194c0 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c  acted from regul
194d0 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  ar rollback-jour
194e0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  nals..  */.  rc 
194f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19500 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
19510 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
19520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19530 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19540 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74  ter_out;.  nMast
19550 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
19560 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d  Pathname+1;.  zM
19570 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73  asterJournal = s
19580 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61  qlite3Malloc(nMa
19590 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
195a0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
195b0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
195c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  rnal ){.    rc =
195d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
195e0 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c  PT;.    goto del
195f0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a  master_out;.  }.
19600 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
19610 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19620 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d  MasterJournal+1]
19630 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19640 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
19650 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
19660 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
19670 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  nal, 0);.  if( r
19680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19690 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
196a0 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  t;.  zMasterJour
196b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
196c0 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75  al] = 0;..  zJou
196d0 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
196e0 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20  urnal;.  while( 
196f0 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
19700 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
19710 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
19720 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20  int exists;.    
19730 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
19740 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
19750 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
19760 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
19770 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ts);.    if( rc!
19780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19790 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
197a0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
197b0 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
197c0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
197d0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
197e0 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
197f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
19800 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f  ists..      ** O
19810 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
19820 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
19830 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19840 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a  nal. If.      **
19850 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
19860 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
19870 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19880 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
19890 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
198a0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23    int flags = .#
198b0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
198c0 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
198d0 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
198e0 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
198f0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
19900 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
19910 64 69 66 0a 20 20 20 20 20 20 20 20 28 53 51 4c  dif.        (SQL
19920 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19930 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
19940 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
19950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19960 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
19970 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
19980 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
19990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
199a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
199b0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
199c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
199d0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
199e0 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
199f0 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
19a00 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
19a10 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19a20 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
19a30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
19a50 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19a60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19a70 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
19a80 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
19a90 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
19aa0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
19ab0 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
19ac0 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
19ad0 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
19ae0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
19af0 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
19b00 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19b10 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19b20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
19b30 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
19b40 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
19b50 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
19b60 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19b70 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
19b80 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
19b90 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
19ba0 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
19bb0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
19bc0 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
19bd0 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
19be0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
19bf0 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19c00 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
19c10 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
19c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
19c30 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
19c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19c50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19c60 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
19c70 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
19c80 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
19c90 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
19ca0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
19cb0 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
19cc0 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
19cd0 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
19ce0 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
19cf0 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
19d00 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
19d10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
19d20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
19d30 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
19d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19d50 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
19d60 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
19d70 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
19d80 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
19d90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19da0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
19db0 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
19dc0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
19dd0 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
19de0 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
19df0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19e00 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
19e10 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
19e20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
19e30 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
19e40 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
19e50 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
19e60 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
19e70 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
19e80 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
19e90 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
19ea0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
19eb0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
19ec0 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
19ed0 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19ee0 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19ef0 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19f00 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
19f10 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
19f20 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
19f30 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
19f40 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
19f50 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
19f60 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
19f70 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
19f80 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
19f90 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
19fa0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
19fb0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
19fc0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19fd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19fe0 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19ff0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
1a000 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
1a010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
1a020 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
1a030 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
1a040 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a050 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
1a060 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a070 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
1a080 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a090 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1a0a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1a0b0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
1a0c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a0d0 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
1a0e0 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
1a0f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a100 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
1a110 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1a120 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1a130 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1a140 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
1a150 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
1a160 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
1a170 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
1a180 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a190 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a1a0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
1a1b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1a1c0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
1a1d0 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
1a1e0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1a1f0 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
1a200 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a210 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1a220 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
1a230 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
1a240 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
1a250 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a260 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
1a270 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
1a280 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
1a290 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
1a2a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a2b0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1a2c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
1a2d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
1a2e0 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
1a2f0 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
1a300 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1a310 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
1a320 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1a330 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1a340 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
1a350 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a360 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1a370 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
1a380 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
1a390 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1a3a0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
1a3b0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1a3c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a3d0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1a3e0 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
1a3f0 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
1a400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1a430 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1a440 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
1a450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a470 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
1a480 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
1a490 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
1a4a0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
1a4b0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1a4c0 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
1a4d0 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
1a4e0 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
1a4f0 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
1a500 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1a510 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1a520 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
1a530 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
1a540 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
1a550 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
1a560 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
1a570 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
1a580 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
1a590 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
1a5a0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
1a5b0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
1a5c0 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
1a5d0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1a5e0 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
1a5f0 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1a600 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
1a610 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1a620 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
1a630 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
1a640 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1a650 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1a660 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
1a670 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
1a680 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1a690 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1a6a0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  l be used .** to
1a6b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1a6c0 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
1a6d0 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
1a6e0 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
1a6f0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
1a700 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
1a710 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
1a720 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
1a730 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
1a740 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a750 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
1a760 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
1a770 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1a780 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
1a790 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
1a7a0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1a7b0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
1a7c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1a7d0 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
1a7e0 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
1a7f0 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
1a800 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
1a810 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
1a820 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
1a830 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
1a840 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
1a850 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
1a860 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1a870 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
1a880 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1a890 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
1a8a0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
1a8b0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a8c0 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
1a8d0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
1a8e0 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
1a8f0 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
1a900 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
1a910 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
1a920 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
1a930 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
1a940 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
1a950 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
1a960 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
1a970 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
1a980 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
1a990 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
1a9a0 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
1a9b0 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
1a9c0 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
1a9d0 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
1a9e0 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
1a9f0 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
1aa00 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
1aa10 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
1aa20 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
1aa30 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1aa40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1aa50 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
1aa60 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1aa70 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1aa80 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
1aa90 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
1aaa0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
1aab0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
1aac0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1aad0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1aae0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1aaf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1ab00 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
1ab10 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1ab20 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1ab30 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
1ab40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ab50 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1ab60 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
1ab70 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
1ab80 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
1ab90 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
1aba0 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
1abb0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1abc0 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
1abd0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
1abe0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
1abf0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1ac00 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
1ac10 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
1ac20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1ac30 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
1ac40 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1ac50 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
1ac60 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70  ite3SectorSize(p
1ac70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
1ac80 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
1ac90 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
1aca0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
1acb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1acc0 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
1acd0 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
1ace0 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
1acf0 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
1ad00 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
1ad10 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1ad20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
1ad30 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
1ad40 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
1ad50 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
1ad60 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
1ad70 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1ad80 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1ad90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
1ada0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
1adb0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
1adc0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
1add0 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
1ade0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
1adf0 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
1ae00 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
1ae10 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1ae20 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
1ae30 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
1ae40 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1ae50 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1ae60 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
1ae70 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
1ae80 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
1ae90 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
1aea0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1aeb0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1aec0 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
1aed0 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
1aee0 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
1aef0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
1af00 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
1af10 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1af20 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
1af30 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
1af40 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
1af50 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
1af60 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
1af70 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
1af80 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1af90 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
1afa0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
1afb0 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
1afc0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
1afd0 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
1afe0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
1aff0 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
1b000 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
1b010 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
1b020 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
1b030 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
1b040 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b050 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
1b060 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1b070 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
1b080 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
1b090 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b0a0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
1b0b0 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
1b0c0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
1b0d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
1b0e0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
1b0f0 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
1b100 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
1b110 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
1b120 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
1b130 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
1b140 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b150 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
1b160 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
1b170 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
1b180 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
1b190 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
1b1a0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
1b1b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b1c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b1d0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
1b1e0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
1b1f0 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
1b200 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
1b210 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
1b220 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
1b230 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1b240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b250 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
1b260 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
1b270 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
1b280 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
1b290 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
1b2a0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
1b2b0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
1b2c0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1b2d0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
1b2e0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
1b2f0 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
1b300 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
1b310 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
1b320 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
1b330 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
1b340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
1b350 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1b360 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1b370 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1b380 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1b390 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1b3a0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1b3b0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1b3c0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1b3d0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1b3e0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1b3f0 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1b400 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1b410 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1b420 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1b430 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1b440 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1b450 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1b460 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1b470 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1b480 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1b490 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1b4a0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1b4b0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1b4c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1b4d0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1b4e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1b4f0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1b500 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1b510 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1b520 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1b530 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1b540 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b550 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1b560 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b570 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1b580 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1b590 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1b5a0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1b5b0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1b5c0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1b5d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1b5e0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1b5f0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1b600 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1b610 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1b620 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1b630 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b640 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1b650 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1b660 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1b670 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1b680 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1b690 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1b6a0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1b6b0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1b6c0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1b6d0 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1b6e0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1b6f0 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1b700 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1b710 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1b720 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1b730 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1b740 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1b750 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1b760 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1b770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b780 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1b790 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1b7a0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1b7b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1b7c0 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1b7d0 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1b7e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1b7f0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1b800 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1b840 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1b850 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1b860 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b870 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1b880 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1b890 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1b8a0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1b8b0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1b8c0 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1b8d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1b8e0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1b8f0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1b900 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b930 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1b940 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1b950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b960 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1b970 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1b980 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1b990 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1b9a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1b9b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b9c0 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1b9d0 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1b9e0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1b9f0 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1ba00 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1ba10 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
1ba20 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30  nt nPlayback = 0
1ba30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ;       /* Total
1ba40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ba50 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a   restored from j
1ba60 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ournal */..  /* 
1ba70 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1ba80 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1ba90 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1baa0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1bab0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1bac0 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1bad0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1bae0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1baf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1bb00 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1bb10 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1bb20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bb30 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1bb40 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1bb50 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1bb60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1bb70 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1bb80 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1bb90 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1bba0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1bbb0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1bbc0 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1bbd0 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1bbe0 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1bbf0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1bc00 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1bc10 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1bc20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1bc30 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1bc40 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1bc50 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1bc60 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1bc70 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1bc80 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1bc90 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1bca0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1bcb0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1bcc0 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1bcd0 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1bce0 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1bcf0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bd00 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1bd10 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1bd20 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1bd30 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1bd40 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1bd50 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1bd60 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1bd70 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1bd80 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1bd90 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1bda0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1bdb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1bdc0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1bdd0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1bde0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bdf0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1be00 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1be10 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1be20 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1be30 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1be40 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1be50 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1be60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1be70 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1be80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1be90 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1bea0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1beb0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1bec0 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1bed0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1bee0 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1bef0 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1bf00 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1bf10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1bf20 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1bf30 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1bf40 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1bf50 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1bf60 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1bf70 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1bf80 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1bf90 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1bfa0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1bfb0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1bfc0 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1bfd0 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1bfe0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1bff0 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1c000 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1c010 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1c020 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1c030 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c040 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1c050 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1c060 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1c070 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1c080 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1c090 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1c0a0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1c0b0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1c0c0 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1c0d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c0e0 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1c0f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c100 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c130 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c150 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1c160 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1c170 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1c180 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1c190 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1c1a0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1c1b0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c1c0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c1d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1c1e0 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1c1f0 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1c200 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1c210 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1c220 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1c230 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1c240 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1c250 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c260 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1c270 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1c280 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c290 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c2a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c2b0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1c2c0 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1c2d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c2e0 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1c2f0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c300 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c310 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1c320 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1c330 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1c340 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1c350 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1c360 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1c370 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1c380 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1c390 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1c3a0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1c3b0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1c3c0 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1c3d0 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1c3e0 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1c3f0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1c400 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1c410 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1c420 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1c430 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1c440 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1c450 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1c460 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1c470 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1c480 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1c490 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1c4a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1c4b0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1c4c0 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1c4d0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1c4e0 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1c4f0 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1c500 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1c510 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c520 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1c530 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1c540 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1c550 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1c560 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1c570 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1c580 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1c590 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1c5a0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1c5b0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1c5c0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1c5d0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1c5e0 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1c5f0 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1c600 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1c610 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1c620 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c630 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1c640 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1c650 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1c660 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c670 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1c680 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1c690 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c6a0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1c6b0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1c6c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c6d0 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1c6e0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1c6f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1c700 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1c710 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1c720 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1c730 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1c740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1c750 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1c760 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1c770 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c780 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1c790 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1c7a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1c7b0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1c7c0 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1c7d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c7e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c7f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c800 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1c810 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c820 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1c830 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1c840 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1c850 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c860 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1c870 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1c880 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1c890 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1c8a0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1c8b0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1c8c0 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1c8d0 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1c8e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1c8f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1c900 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1c910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c920 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1c930 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1c940 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1c950 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1c960 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c970 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c980 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1c990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c9a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c9b0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1c9c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c9d0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1c9e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c9f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1ca00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1ca10 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1ca20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1ca30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1ca40 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1ca50 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1ca60 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1ca70 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1ca80 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1ca90 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1caa0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1cab0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1cac0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1cad0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1cae0 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1caf0 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1cb00 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1cb10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1cb20 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1cb30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1cb40 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1cb50 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1cb60 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1cb70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1cb80 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1cb90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cba0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1cbb0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1cbc0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1cbd0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1cbe0 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1cbf0 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1cc00 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1cc10 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1cc20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1cc30 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1cc40 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1cc50 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1cc60 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1cc70 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1cc80 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1cc90 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1cca0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1ccb0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1ccc0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1ccd0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1cce0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1ccf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1cd00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1cd10 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1cd20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cd30 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1cd40 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1cd50 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1cd60 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1cd70 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1cd80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1cd90 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1cda0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1cdb0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1cdc0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1cdd0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1cde0 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1cdf0 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1ce00 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1ce10 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1ce20 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1ce30 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1ce40 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1ce50 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1ce60 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1ce70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1ce80 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1ce90 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1cea0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1ceb0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1cec0 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1ced0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1cee0 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1cef0 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1cf00 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1cf10 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1cf20 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1cf30 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1cf40 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1cf50 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1cf60 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1cf70 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1cf80 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1cf90 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1cfa0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1cfb0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1cfc0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1cfd0 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1cfe0 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1cff0 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1d000 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1d010 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1d020 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1d030 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1d040 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1d050 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1d060 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1d070 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d080 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1d090 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1d0a0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1d0b0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1d0c0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1d0d0 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1d0e0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1d0f0 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1d100 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1d110 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1d120 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1d130 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1d140 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1d150 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1d160 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1d170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1d190 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1d1a0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1d1b0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1d1c0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1d1d0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1d1e0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d1f0 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1d200 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d210 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d220 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d230 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1d240 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1d250 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1d260 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1d270 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1d280 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d290 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1d2a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d2c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1d2d0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1d2e0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1d2f0 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1d300 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d310 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d330 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1d340 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1d350 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1d360 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1d370 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1d380 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1d390 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1d3a0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1d3b0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1d3c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1d3d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1d3e0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1d3f0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1d400 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d420 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1d430 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1d440 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1d450 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1d460 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1d470 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1d480 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1d4a0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1d4b0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1d4c0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1d4d0 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1d4e0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1d4f0 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1d500 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1d510 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1d520 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1d530 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1d540 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1d550 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1d560 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1d570 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1d580 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1d590 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1d5a0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1d5b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1d5c0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1d5d0 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1d5e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d5f0 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1d600 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1d610 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1d620 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1d630 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1d640 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1d650 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1d660 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1d670 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1d680 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1d690 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1d6a0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1d6b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1d6c0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1d6d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d6e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1d6f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1d700 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1d710 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1d720 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1d730 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d740 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1d750 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1d760 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1d770 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1d780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d790 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1d7a0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1d7b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1d7c0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1d7d0 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1d7e0 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1d7f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1d800 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1d810 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1d820 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1d830 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1d840 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1d850 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1d860 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1d870 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d880 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d890 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1d8a0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1d8b0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1d8c0 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1d8d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1d8e0 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1d8f0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1d900 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1d910 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1d920 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1d930 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1d940 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1d950 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1d960 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1d970 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d980 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1d990 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1d9a0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1d9b0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1d9c0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1d9d0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1d9e0 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1d9f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1da00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1da10 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1da20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1da30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1da40 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1da50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1da60 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1da70 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1da80 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1da90 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1daa0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1dab0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1dac0 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1dad0 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1dae0 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1daf0 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1db00 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1db10 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1db20 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1db30 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1db40 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1db50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1db60 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1db70 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1db80 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1db90 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1dba0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1dbb0 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1dbc0 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1dbd0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1dbe0 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1dbf0 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1dc00 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1dc10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1dc20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1dc30 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1dc40 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1dc50 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1dc60 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1dc70 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1dc80 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1dc90 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1dca0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1dcb0 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1dcc0 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1dcd0 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1dce0 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1dcf0 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1dd00 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1dd10 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1dd20 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1dd30 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1dd40 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1dd50 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1dd60 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1dd70 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1dd80 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1dd90 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1dda0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1ddb0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1ddc0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1ddd0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1dde0 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1ddf0 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1de00 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1de10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1de20 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1de30 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1de40 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1de50 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1de60 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1de70 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1de80 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1de90 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1dea0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1deb0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1dec0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1ded0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1dee0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1def0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1df00 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1df10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1df20 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1df30 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1df40 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1df50 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1df60 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1df70 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1df80 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1df90 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1dfa0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1dfb0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1dfc0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1dfd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1dfe0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1dff0 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1e000 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1e010 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1e020 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1e030 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1e040 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1e050 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1e060 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1e070 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1e080 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1e090 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1e0a0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1e0b0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1e0c0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1e0d0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e0e0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e0f0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e100 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1e110 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1e120 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1e130 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1e140 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1e150 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e160 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1e170 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1e180 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1e190 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1e1a0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1e1b0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1e1c0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1e1d0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1e1e0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e1f0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1e200 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1e210 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1e220 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e230 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e240 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1e250 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1e260 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e270 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1e280 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1e290 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e2a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1e2b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e2c0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1e2d0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1e2e0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1e2f0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1e300 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1e310 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1e320 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e330 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1e340 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1e350 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e360 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1e370 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1e380 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1e390 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1e3a0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1e3b0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1e3c0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1e3d0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1e3e0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1e3f0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1e400 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1e410 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1e420 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1e430 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1e440 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1e450 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1e460 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1e470 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1e480 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1e490 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1e4a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1e4b0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1e4c0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1e4d0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1e4e0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1e4f0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1e500 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1e510 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1e520 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1e530 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1e540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e550 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e560 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1e570 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1e580 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e590 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e5a0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1e5b0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1e5c0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1e5d0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1e5e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1e5f0 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1e600 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1e610 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1e620 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1e630 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1e640 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1e650 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1e660 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1e670 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1e680 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1e690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e6a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1e6b0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1e6c0 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1e6d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e6e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e6f0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1e700 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1e710 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1e720 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1e730 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1e740 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1e750 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1e760 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e770 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1e780 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1e790 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1e7a0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1e7b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1e7c0 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1e7d0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1e7e0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1e7f0 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1e800 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1e810 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1e820 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1e830 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1e840 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1e850 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1e860 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1e870 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1e880 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1e890 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1e8a0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1e8b0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1e8c0 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1e8d0 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1e8e0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e8f0 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1e900 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1e910 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1e920 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1e930 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1e940 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1e950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1e960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e970 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1e980 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1e990 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1e9a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e9b0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1e9c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e9d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1ea00 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1ea10 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1ea20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1ea30 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1ea40 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1ea50 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1ea60 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1ea70 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1ea80 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1ea90 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1eaa0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1eab0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1eac0 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1ead0 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1eae0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1eaf0 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1eb00 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1eb10 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1eb20 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1eb30 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1eb40 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1eb50 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1eb60 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1eb70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1eb80 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1eb90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1eba0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1ebb0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1ebc0 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1ebd0 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1ebe0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1ebf0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1ec00 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1ec10 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1ec20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ec30 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1ec40 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1ec50 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1ec60 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1ec70 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1ec80 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1ec90 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1eca0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1ecb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ecc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1ecd0 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1ece0 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1ecf0 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1ed00 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1ed10 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1ed20 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1ed30 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1ed40 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1ed50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1ed60 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1ed70 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1ed80 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1ed90 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1eda0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1edb0 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1edc0 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1edd0 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1ede0 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1edf0 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1ee00 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1ee10 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1ee20 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1ee30 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1ee40 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1ee50 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1ee60 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1ee70 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1ee80 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1ee90 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1eea0 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1eeb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1eec0 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1eed0 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1eee0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1eef0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1ef00 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1ef10 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1ef20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1ef50 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1ef60 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1ef90 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1efa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1efb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1efc0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1efd0 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1efe0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1eff0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1f000 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1f010 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1f020 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1f030 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1f040 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1f050 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1f060 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1f070 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1f080 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1f090 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f0a0 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1f0b0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f0c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1f0d0 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1f0e0 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1f0f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1f100 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1f110 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1f120 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1f130 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1f140 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1f150 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1f160 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1f170 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1f180 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1f190 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1f1a0 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1f1b0 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1f1c0 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1f1d0 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1f1e0 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1f1f0 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1f200 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1f210 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1f220 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1f230 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1f240 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1f250 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1f260 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1f270 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1f280 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1f290 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1f2a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1f2b0 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1f2c0 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1f2d0 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1f2e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1f2f0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1f300 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1f310 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1f320 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1f330 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1f340 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1f350 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1f360 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1f370 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1f380 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1f390 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1f3a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1f3b0 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1f3c0 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1f3d0 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1f3e0 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1f3f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f400 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1f410 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72  ackup ){.    for
1f420 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f430 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1f440 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1f450 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1f460 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1f470 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1f480 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1f490 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1f4a0 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1f4b0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1f4c0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1f4d0 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1f4e0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1f4f0 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1f500 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1f510 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1f520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f530 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1f540 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1f550 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1f560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1f570 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1f580 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1f590 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1f5a0 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1f5b0 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1f5c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f5d0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1f5e0 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1f5f0 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1f600 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1f610 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1f620 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1f630 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1f640 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1f650 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1f660 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1f670 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1f680 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1f690 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f6a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1f6d0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1f6e0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1f6f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1f700 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1f710 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1f720 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1f730 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1f740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f750 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f760 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1f770 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1f780 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1f790 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1f7a0 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1f7b0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1f7c0 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1f7d0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1f7e0 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1f7f0 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1f800 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1f810 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1f820 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1f830 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1f840 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1f850 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1f860 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1f870 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1f880 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1f890 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f8a0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1f8b0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
1f8c0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f8d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
1f8e0 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
1f8f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1f900 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
1f910 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1f920 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46  r);.    if( USEF
1f930 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
1f940 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
1f950 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
1f960 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1f970 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1f980 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f990 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
1f9a0 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
1f9b0 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
1f9c0 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
1f9d0 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
1f9e0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1f9f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1fa00 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
1fa10 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
1fa20 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
1fa30 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
1fa40 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
1fa50 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
1fa60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
1fa70 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1fa80 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
1fa90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1faa0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
1fab0 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
1fac0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
1fad0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
1fae0 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
1faf0 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
1fb00 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1fb10 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
1fb20 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
1fb30 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
1fb40 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1fb50 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
1fb60 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
1fb90 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
1fba0 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
1fbb0 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
1fbc0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
1fbd0 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
1fbe0 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
1fbf0 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
1fc00 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
1fc10 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
1fc20 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
1fc30 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
1fc40 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1fc50 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1fc60 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
1fc70 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
1fc80 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
1fc90 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1fca0 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
1fcb0 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
1fcc0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
1fcd0 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
1fce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
1fcf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1fd00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1fd10 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
1fd20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
1fd30 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
1fd40 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
1fd50 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
1fd60 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
1fd70 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
1fd80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fd90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1fda0 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1fdb0 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
1fdc0 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
1fdd0 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
1fde0 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  nte based on the
1fdf0 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1fe00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fe10 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66    If the size of
1fe20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fe30 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a  le is not an.  *
1fe40 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  * integer multip
1fe50 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
1fe60 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68  ize, round up th
1fe70 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20  e result..  */. 
1fe80 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1fe90 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20  .    i64 n = 0; 
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62     /* Size of db
1fec0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1fed0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
1fee0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1fef0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1ff00 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1ff10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1ff20 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  d) ){.      int 
1ff30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1ff40 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1ff50 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66  d, &n);.      if
1ff60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ff80 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ff90 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
1ffa0 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
1ffb0 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
1ffc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ffd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1ffe0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
1fff0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
20000 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
20010 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
20020 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
20030 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
20040 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20050 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20060 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20070 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20080 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20090 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
200a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
200b0 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
200c0 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
200d0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
200e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
200f0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20100 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
20110 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
20120 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
20130 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20140 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20150 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20160 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20170 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20180 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20190 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
201a0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
201b0 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
201c0 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
201d0 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
201e0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
201f0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20200 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20210 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20220 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20230 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20240 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20250 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20260 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20270 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20280 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20290 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
202a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
202b0 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
202c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
202d0 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
202e0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
202f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20300 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20310 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20320 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20330 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20340 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20350 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20360 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20370 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20380 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20390 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
203a0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
203b0 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
203c0 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
203d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
203e0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
203f0 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20400 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20410 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20420 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20430 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20440 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20450 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20460 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20470 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20480 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20490 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
204a0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
204b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
204c0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
204d0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
204e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
204f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20500 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20510 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20520 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20530 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20540 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20550 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20570 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20580 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20590 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
205a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
205b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
205c0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
205d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
205e0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
205f0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
20600 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
20610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20620 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
20630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20640 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
20650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20670 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20680 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20690 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
206a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
206b0 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
206c0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
206d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
206e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
206f0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
20700 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
20710 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
20720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
20730 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20740 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20750 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
20760 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
20770 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20780 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20790 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
207a0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
207b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
207c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
207d0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
207e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
207f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20800 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
20810 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
20820 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
20830 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
20840 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
20850 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
20860 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20870 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20880 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20890 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
208a0 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
208b0 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
208c0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
208d0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
208e0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
208f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
20900 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
20910 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
20920 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
20930 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
20940 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
20950 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
20960 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
20970 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20980 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20990 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
209a0 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
209b0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
209c0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
209d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
209e0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
209f0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20a00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20a10 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20a20 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
20a30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20a40 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
20a50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20a60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
20a70 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
20a80 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20a90 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
20aa0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20ab0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20ac0 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
20ad0 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
20ae0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
20af0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
20b00 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
20b10 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
20b20 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
20b30 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
20b40 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
20b50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20b60 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
20b70 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
20b80 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
20b90 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20ba0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20bb0 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
20bc0 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
20bd0 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
20be0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
20bf0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
20c00 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
20c10 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
20c20 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
20c30 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
20c40 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
20c50 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
20c60 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
20c70 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20c80 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20c90 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20ca0 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20cb0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20cc0 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
20cd0 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
20ce0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
20cf0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
20d00 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
20d10 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
20d20 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
20d30 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
20d40 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
20d50 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
20d60 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20d70 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20d80 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20d90 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20da0 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20db0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
20dc0 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
20dd0 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
20de0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
20df0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
20e00 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
20e10 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
20e20 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
20e30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20e40 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
20e50 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
20e60 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20e70 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20e80 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20e90 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20ea0 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20eb0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20ec0 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20ed0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20ee0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20ef0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20f00 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
20f10 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
20f20 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
20f50 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
20f60 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
20f70 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
20f80 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
20f90 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
20fa0 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
20fb0 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
20fc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20fd0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20fe0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
20ff0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
21000 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
21010 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
21020 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
21030 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21040 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
21050 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
21060 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21070 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
21080 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
21090 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
210a0 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
210b0 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
210c0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
210d0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
210e0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
210f0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
21100 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
21110 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
21120 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
21130 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21140 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
21150 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
21160 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21170 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
21180 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
21190 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
211a0 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
211b0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
211c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
211d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
211e0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
211f0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
21200 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
21210 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
21220 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
21230 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21240 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
21250 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
21260 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21270 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
21280 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
21290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
212a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
212b0 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
212c0 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
212d0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
212e0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
212f0 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
21300 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
21310 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
21320 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21330 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21340 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
21350 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
21360 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
21370 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21380 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
21390 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
213a0 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
213b0 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
213c0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
213d0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
213e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
213f0 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
21400 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
21410 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21420 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
21430 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21440 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21450 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
21460 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
21470 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
21480 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
21490 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
214a0 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
214b0 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
214c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
214d0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
214e0 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
214f0 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
21500 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
21510 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
21520 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
21530 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
21540 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
21550 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
21560 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21570 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
21580 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21590 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
215a0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
215b0 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
215c0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
215d0 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
215e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
215f0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
21600 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
21610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21620 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21630 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21640 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21650 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21660 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21670 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21680 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21690 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
216a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
216b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
216c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
216d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
216e0 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
216f0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
21700 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21710 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21720 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
21730 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21740 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
21750 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
21760 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
21770 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21780 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
21790 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
217a0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
217b0 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
217c0 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
217d0 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
217e0 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
217f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21800 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
21810 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
21820 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21830 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21840 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
21850 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
21860 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
21870 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
21880 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
21890 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
218a0 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
218b0 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
218c0 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
218d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
218e0 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
218f0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
21900 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21910 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21920 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21930 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
21940 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
21950 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
21960 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
21970 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
21980 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
21990 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
219a0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
219b0 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
219c0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
219d0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
219e0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
219f0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21a00 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21a10 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
21a20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
21a30 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
21a40 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
21a50 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
21a60 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
21a70 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
21a80 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
21a90 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
21aa0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
21ab0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
21ac0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21ad0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21af0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
21b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21b10 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21b20 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
21b30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21b40 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
21b50 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
21b60 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
21b70 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
21b80 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
21b90 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
21ba0 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
21bb0 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
21bc0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
21bd0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
21be0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
21bf0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
21c00 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
21c10 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
21c20 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
21c30 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21c40 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
21c50 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21c60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21c70 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
21c80 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
21c90 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
21ca0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21cb0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
21cc0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21cd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21ce0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
21cf0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
21d00 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
21d10 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
21d20 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
21d30 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
21d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21d50 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
21d60 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
21d70 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
21d80 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
21d90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
21da0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
21db0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21dc0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
21dd0 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
21de0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21df0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21e00 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
21e10 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21e20 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
21e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21e40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21e50 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
21e60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21e70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
21e80 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21e90 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21ea0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21eb0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
21ec0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
21ed0 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
21ee0 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
21ef0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
21f00 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21f10 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21f20 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21f30 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21f40 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
21f50 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
21f60 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
21f70 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21f80 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21f90 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21fa0 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
21fb0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
21fc0 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
21fd0 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
21fe0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21ff0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
22000 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22010 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
22020 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
22030 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
22040 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22050 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
22060 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
22070 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
22080 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
22090 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
220a0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
220b0 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
220c0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
220d0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
220e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
220f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
22100 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
22110 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
22120 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
22130 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
22140 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22150 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
22160 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
22170 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
22180 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
22190 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
221a0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
221b0 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
221c0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
221d0 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  &sz);.  }.#endif
221e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
221f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
22200 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20  e of any memory 
22210 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20  mapping made of 
22220 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22230 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22240 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
22250 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
22260 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
22270 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67   szMmap){.  pPag
22280 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d  er->szMmap = szM
22290 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d  map;.  pagerFixM
222a0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
222b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
222c0 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
222d0 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74   possible from t
222e0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69  he pager..*/.voi
222f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  d sqlite3PagerSh
22300 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67  rink(Pager *pPag
22310 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
22320 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65  acheShrink(pPage
22330 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
22340 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74  /*.** Adjust set
22350 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  tings of the pag
22360 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  er to those spec
22370 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46  ified in the pgF
22380 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a  lags parameter..
22390 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c  **.** The "level
223a0 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50  " in pgFlags & P
223b0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
223c0 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72  _MASK sets the r
223d0 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20  obustness.** of 
223e0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
223f0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
22400 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65   crashes or powe
22410 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a  r failures by.**
22420 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
22430 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
22440 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68   when writing th
22450 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  e journals..** T
22460 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
22470 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
22480 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
22490 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
224a0 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
224b0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
224c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
224d0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
224e0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
224f0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
22500 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
22510 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
22520 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
22530 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
22540 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
22550 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
22560 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
22570 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
22580 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22590 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
225a0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
225b0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
225c0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
225d0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
225e0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
225f0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
22600 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
22620 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
22630 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
22640 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
22650 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22660 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
22670 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
22680 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
22690 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
226a0 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
226b0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
226c0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
226d0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
226e0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
226f0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
22700 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
22710 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22720 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
22730 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
22740 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
22750 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
22760 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
22770 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
22780 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
227a0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
227b0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
227c0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
227d0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
227e0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
227f0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
22800 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
22810 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
22820 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
22830 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
22840 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
22850 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
22860 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ack..**.** The a
22870 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f  bove is for a ro
22880 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d  llback-journal m
22890 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f  ode.  For WAL mo
228a0 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65  de, OFF continue
228b0 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61  s.** to mean tha
228c0 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20  t no syncs ever 
228d0 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d  occur.  NORMAL m
228e0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
228f0 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70  L is synced.** p
22900 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
22910 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20  t of checkpoint 
22920 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74  and that the dat
22930 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73 79  abase file is sy
22940 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63  nced.** at the c
22950 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65  onclusion of the
22960 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74   checkpoint if t
22970 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
22980 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20  t of the WAL.** 
22990 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b  was written back
229a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
229b0 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63  se.  But no sync
229c0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75   operations occu
229d0 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69  r for.** an ordi
229e0 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e  nary commit in N
229f0 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20  ORMAL mode with 
22a00 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73  WAL.  FULL means
22a10 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a   that the WAL.**
22a20 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
22a30 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63  following each c
22a40 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c  ommit operation,
22a50 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   in addition to 
22a60 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73  the.** syncs ass
22a70 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52  ociated with NOR
22a80 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  MAL..**.** Do no
22a90 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72  t confuse synchr
22aa0 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20  onous=FULL with 
22ab0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22ac0 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45  .  The.** SQLITE
22ad0 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f  _SYNC_FULL macro
22ae0 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68   means to use th
22af0 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66  e MacOSX-style f
22b00 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69  ull-fsync.** usi
22b10 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46  ng fcntl(F_FULLF
22b20 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53  SYNC).  SQLITE_S
22b30 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  YNC_NORMAL means
22b40 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64   to do an.** ord
22b50 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63 61  inary fsync() ca
22b60 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ll.  There is no
22b70 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
22b80 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  een SQLITE_SYNC_
22b90 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  FULL.** and SQLI
22ba0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
22bb0 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65  n platforms othe
22bc0 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20  r than MacOSX.  
22bd0 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68  But the.** synch
22be0 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73  ronous=FULL vers
22bf0 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e  us synchronous=N
22c00 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65  ORMAL setting de
22c10 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a  termines when.**
22c20 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69   the xSync primi
22c30 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tive is called a
22c40 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74  nd is relevant t
22c50 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e  o all platforms.
22c60 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
22c70 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
22c80 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
22c90 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
22ca0 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
22cb0 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
22cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
22cd0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
22ce0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22cf0 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20  tFlags(.  Pager 
22d00 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22d10 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20  /* The pager to 
22d20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c  set safety level
22d30 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   for */.  unsign
22d40 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
22d50 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
22d60 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
22d70 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67  d level = pgFlag
22d80 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
22d90 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66  ONOUS_MASK;.  if
22da0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
22db0 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
22dc0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20  ->noSync = 1;.  
22dd0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
22de0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
22df0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
22e00 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
22e10 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22e20 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53    level==PAGER_S
22e30 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f  YNCHRONOUS_OFF ?
22e40 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1:0;.    pPager-
22e50 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
22e60 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l>=PAGER_SYNCHRO
22e70 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a  NOUS_FULL ?1:0;.
22e80 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
22e90 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50  aSync = level==P
22ea0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22eb0 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d  _EXTRA ?1:0;.  }
22ec0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
22ed0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
22ee0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22ef0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
22f00 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22f10 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
22f20 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  gFlags & PAGER_F
22f30 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20  ULLFSYNC ){.    
22f40 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
22f50 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22f60 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  FULL;.    pPager
22f70 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22f80 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22f90 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LL;.  }else if( 
22fa0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22fb0 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29  CKPT_FULLFSYNC )
22fc0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22fd0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22fe0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
22ff0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
23000 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
23010 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
23020 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23030 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23040 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23050 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
23060 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  tSyncFlags = SQL
23070 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
23080 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77  .  }.  pPager->w
23090 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50  alSyncFlags = pP
230a0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b  ager->syncFlags;
230b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
230c0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
230d0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
230e0 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f  ags |= WAL_SYNC_
230f0 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
23100 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73 20  }.  if( pgFlags 
23110 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50 49  & PAGER_CACHESPI
23120 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  LL ){.    pPager
23130 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20  ->doNotSpill &= 
23140 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a  ~SPILLFLAG_OFF;.
23150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23160 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
23170 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46  |= SPILLFLAG_OFF
23180 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
23190 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
231a0 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
231b0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
231c0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
231d0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
231e0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
231f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
23200 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
23210 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
23220 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
23230 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
23240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
23250 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
23260 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
23270 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
23280 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
23290 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
232a0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
232b0 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
232c0 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
232d0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
232e0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
232f0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
23300 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
23310 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
23320 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
23330 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
23340 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
23350 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
23360 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
23370 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
23380 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
23390 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
233a0 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
233b0 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
233c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
233d0 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
233e0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
233f0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23400 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
23410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
23420 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
23430 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23440 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
23450 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
23460 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
23470 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
23480 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
23490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
234a0 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
234b0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
234c0 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
234d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
234e0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
234f0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
23500 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
23510 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23520 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23530 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
23540 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
23550 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
23560 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
23570 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
23580 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
23590 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
235a0 66 73 46 6c 61 67 73 20 7c 3d 20 20 0a 23 69 66  fsFlags |=  .#if
235b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
235c0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
235d0 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
235e0 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
235f0 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
23600 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
23610 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
23620 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
23630 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
23640 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
23650 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
23660 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
23670 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
23680 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
23690 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
236a0 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
236b0 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
236c0 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
236d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
236e0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
236f0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
23700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
23710 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
23720 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
23730 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
23740 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
23750 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
23760 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
23770 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
23780 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
23790 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
237a0 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
237b0 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
237c0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
237d0 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
237e0 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
237f0 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
23800 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
23810 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
23820 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
23830 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
23840 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
23850 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
23860 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
23870 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
23880 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
23890 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
238a0 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
238b0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
238c0 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
238e0 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
238f0 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
23900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23930 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
23940 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
23950 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
23960 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
23970 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
23980 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
23990 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
239a0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
239b0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
239c0 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
239d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
239e0 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
239f0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
23a00 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
23a10 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
23a20 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
23a30 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
23a40 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
23a50 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
23a60 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
23a70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
23a80 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
23a90 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
23aa0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
23ab0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
23ac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
23af0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
23b00 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
23b10 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
23b20 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
23b30 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
23b40 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
23b50 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b70 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
23b80 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
23b90 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
23ba0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
23bb0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23bc0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
23bd0 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
23be0 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
23bf0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23c00 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
23c10 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
23c20 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
23c30 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
23c40 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
23c50 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
23c60 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
23c70 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
23c80 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
23c90 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
23ca0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
23cb0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
23cc0 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
23cd0 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
23ce0 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
23cf0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
23d00 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
23d10 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
23d20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
23d30 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
23d40 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
23d50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23d60 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
23d70 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
23d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23d90 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
23da0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
23db0 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
23dc0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
23dd0 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
23de0 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
23df0 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
23e00 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
23e10 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
23e20 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
23e30 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
23e40 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23e50 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
23e60 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
23e70 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
23e80 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
23e90 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
23ea0 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
23eb0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
23ec0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
23ed0 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
23ee0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
23ef0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
23f00 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
23f10 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
23f20 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
23f30 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
23f40 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23f50 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
23f60 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
23f70 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
23f80 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
23f90 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
23fa0 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
23fb0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
23fc0 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
23fd0 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
23fe0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23ff0 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
24000 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
24010 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
24020 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
24030 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
24040 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
24050 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
24060 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
24070 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
24080 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
24090 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
240a0 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
240b0 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
240c0 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
240d0 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
240e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
240f0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
24100 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
24110 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
24120 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
24130 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
24140 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
24150 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
24160 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
24170 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
24180 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
24190 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
241a0 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
241b0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
241c0 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
241d0 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
241e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
241f0 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
24200 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
24210 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
24220 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
24230 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
24240 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
24250 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
24260 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
24270 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
24280 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
24290 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
242a0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
242b0 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
242c0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
242d0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
242e0 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
242f0 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
24300 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
24310 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
24320 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
24330 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
24340 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
24350 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
24360 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
24370 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
24380 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
24390 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
243a0 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
243b0 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
243c0 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
243d0 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
243e0 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
243f0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24400 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
24410 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
24420 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
24430 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
24440 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
24450 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
24460 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
24470 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
24480 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
24490 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
244a0 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
244b0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
244c0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
244d0 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
244e0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
244f0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
24500 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
24510 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
24520 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
24530 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
24540 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
24550 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
24560 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
24570 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
24580 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
24590 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
245a0 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
245b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
245c0 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
245d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
245e0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
245f0 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
24600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
24620 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
24630 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
24640 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
24650 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
24660 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
24670 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
24680 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24690 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
246a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
246b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
246c0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
246d0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
246e0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
246f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24710 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
24720 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
24730 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
24740 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
24750 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
24760 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
24770 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
24780 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
24790 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
247a0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
247b0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
247c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
247d0 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
247e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
247f0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
24800 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
24810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24820 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
24830 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
24840 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
24850 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
24860 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
24870 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
24880 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
24890 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
248a0 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
248b0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
248c0 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
248d0 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
248e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
248f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24910 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
24920 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
24930 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
24940 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
24950 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
24960 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
24970 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
24980 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
24990 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
249a0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
249b0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
249c0 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
249d0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
249e0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
249f0 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
24a00 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
24a10 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
24a20 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
24a30 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
24a40 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
24a50 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
24a60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
24a70 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
24a80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24a90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24aa0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
24ab0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
24ac0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
24ad0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
24ae0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
24af0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
24b00 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
24b10 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
24b20 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
24b30 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
24b40 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
24b50 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
24b60 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
24b70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
24b80 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
24b90 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
24ba0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
24bb0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
24bc0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
24bd0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
24be0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24bf0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24c00 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24c10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24c20 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
24c30 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
24c40 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24c50 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
24c60 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
24c70 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
24c80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24c90 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
24ca0 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
24cb0 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
24cc0 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
24cd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24ce0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
24cf0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24d00 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24d10 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24d20 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24d30 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
24d40 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
24d50 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24d60 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
24d70 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
24d80 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
24d90 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24da0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
24db0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
24dc0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
24dd0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
24de0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
24df0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24e00 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24e10 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24e20 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24e30 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24e40 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
24e50 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24e60 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
24e70 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
24e80 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24e90 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
24ea0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
24eb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24ec0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
24ed0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24ee0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
24ef0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24f00 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24f10 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24f20 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24f30 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
24f40 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
24f50 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24f60 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
24f70 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
24f80 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24f90 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
24fa0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
24fb0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
24fc0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
24fd0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
24fe0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
24ff0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
25000 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
25010 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
25020 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
25030 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
25040 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
25050 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
25060 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
25070 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
25080 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
25090 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
250a0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
250b0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
250c0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
250d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
250e0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
250f0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
25100 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
25110 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
25120 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
25130 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
25140 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
25150 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
25160 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
25170 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
25180 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
25190 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
251a0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
251b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
251c0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
251d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
251e0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
251f0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
25200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25210 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
25220 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
25230 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
25240 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
25250 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25260 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
25270 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
25280 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
25290 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
252a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
252b0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
252c0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
252d0 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
252e0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
252f0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
25300 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
25310 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
25320 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
25330 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
25340 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
25350 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
25360 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
25370 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
25380 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25390 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
253a0 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
253b0 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
253c0 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
253d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
253e0 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
253f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
25400 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
25410 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
25420 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25430 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
25440 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25450 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25460 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
25470 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
25480 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
25490 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
254a0 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
254b0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
254c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
254d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
254e0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
254f0 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
25500 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
25510 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
25520 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
25530 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
25540 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
25550 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25560 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
25570 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
25580 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25590 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
255a0 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
255b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
255c0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
255d0 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
255e0 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
255f0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
25600 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
25610 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
25620 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
25630 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
25640 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
25650 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
25660 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
25670 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
25680 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
25690 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
256a0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
256b0 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
256c0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
256d0 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
256e0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
256f0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
25700 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
25710 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
25720 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
25730 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
25740 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
25750 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
25760 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
25770 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
25780 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
25790 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
257a0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
257b0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
257c0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
257d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
257e0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
257f0 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
25800 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
25810 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
25820 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
25830 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
25840 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
25850 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
25860 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
25870 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
25880 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
25890 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
258a0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
258d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
258e0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
258f0 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
25900 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
25910 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
25920 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
25930 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
25940 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
25950 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
25960 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
25970 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
25980 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
25990 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
259a0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
259b0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
259c0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
259d0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
259e0 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
259f0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25a00 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
25a10 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
25a20 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
25a30 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
25a40 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
25a50 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
25a60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
25a70 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
25a80 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
25a90 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
25aa0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
25ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
25ac0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
25ad0 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
25ae0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
25af0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
25b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
25b10 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
25b20 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
25b30 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
25b40 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
25b50 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
25b60 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
25b70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
25b80 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
25b90 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
25ba0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
25bb0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
25bc0 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
25bd0 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
25be0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25bf0 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25c00 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25c10 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25c20 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
25c30 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
25c40 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
25c50 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
25c60 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
25c70 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
25c80 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
25c90 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
25ca0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
25cb0 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
25cc0 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
25cd0 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
25ce0 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
25cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25d00 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25d10 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25d20 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25d30 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
25d40 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
25d50 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
25d60 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
25d70 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
25d80 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25d90 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
25da0 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
25db0 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
25dc0 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
25dd0 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
25de0 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
25df0 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25e00 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25e10 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25e20 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25e30 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
25e40 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
25e50 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
25e60 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
25e70 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
25e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25e90 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
25ea0 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
25eb0 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
25ec0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
25ed0 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
25ee0 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
25ef0 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25f00 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25f10 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25f20 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25f30 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
25f40 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
25f50 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
25f60 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
25f70 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
25f80 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
25f90 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25fa0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25fb0 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
25fc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
25fd0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
25fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
25ff0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
26000 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
26010 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
26020 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
26030 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
26040 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26060 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26070 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
26080 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
26090 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
260a0 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
260b0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
260c0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
260d0 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
260e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
260f0 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
26100 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
26110 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
26120 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
26130 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
26140 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
26150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26160 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
26170 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
26180 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
26190 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
261a0 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
261b0 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
261c0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
261d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
261e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
261f0 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
26200 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
26210 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
26220 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26230 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
26240 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
26250 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
26260 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
26270 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
26280 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
26290 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
262a0 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
262b0 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
262c0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
262d0 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
262e0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
262f0 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
26300 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
26310 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
26320 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
26330 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
26340 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
26350 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
26360 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
26370 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
26380 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
26390 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
263a0 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
263b0 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
263c0 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
263d0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
263e0 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
263f0 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
26400 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
26410 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
26420 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
26430 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
26440 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
26450 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
26460 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
26470 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
26480 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
26490 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
264a0 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
264b0 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
264c0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
264d0 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
264e0 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
264f0 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
26500 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
26510 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26520 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
26530 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
26540 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
26550 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
26560 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
26570 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
26580 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
26590 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
265a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
265b0 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
265c0 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
265d0 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
265e0 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
265f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26600 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26610 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
26620 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
26630 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
26640 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
26650 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
26660 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
26670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
26680 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
26690 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
266a0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
266b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
266c0 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
266d0 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
266e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
266f0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
26700 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
26710 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
26720 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
26730 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
26740 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
26750 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
26760 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
26770 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
26780 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
26790 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
267a0 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
267b0 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
267c0 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
267d0 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
267e0 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
267f0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
26800 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
26810 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
26820 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26830 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
26840 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
26850 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26860 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
26870 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
26880 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
268a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
268b0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
268c0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
268d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
268e0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
268f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26920 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
26930 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
26940 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
26950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26960 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
26970 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
26980 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26990 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
269a0 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
269b0 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
269c0 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
269d0 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
269e0 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
269f0 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
26a00 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
26a10 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
26a20 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
26a30 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
26a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
26a50 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
26a60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26a70 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
26a80 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
26a90 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
26aa0 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
26ab0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
26ac0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
26ad0 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
26ae0 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
26af0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
26b00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26b10 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26b20 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
26b30 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
26b40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
26b50 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
26b60 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
26b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
26b80 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
26b90 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26bb0 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
26bc0 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
26bd0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
26be0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
26bf0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26c00 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26c10 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26c20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
26c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
26c40 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26c50 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a  to return */.  .
26c60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
26c70 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
26c80 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
26c90 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26ca0 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
26cb0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26cc0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
26cd0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
26ce0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
26cf0 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
26d00 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  r->nExtra);.  }e
26d10 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26d20 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26d30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26d40 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
26d50 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
26d60 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26d70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26d80 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26d90 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
26da0 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
26db0 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
26dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26dd0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
26de0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
26df0 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
26e00 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26e10 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26e20 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26e30 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26e40 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26e50 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26e60 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26e80 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26e90 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26ea0 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
26eb0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26ec0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
26ed0 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
26ee0 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
26ef0 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
26f00 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26f10 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26f20 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26f30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26f40 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26f50 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26f60 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
26f70 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
26f80 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
26f90 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
26fa0 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
26fb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26fc0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26fd0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
26fe0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26ff0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
27000 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
27010 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
27020 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
27030 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
27040 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27050 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
27060 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
27070 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
27080 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
27090 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
270a0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
270b0 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
270c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
270d0 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
270e0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
270f0 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
27100 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
27110 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
27120 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
27130 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
27140 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
27150 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
27160 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
27170 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27180 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
27190 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
271a0 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
271b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
271c0 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
271d0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
271e0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
271f0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
27200 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
27210 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
27220 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
27230 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
27240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27250 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
27260 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
27270 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
27280 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27290 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
272a0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
272b0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
272c0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
272d0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
272e0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
272f0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
27300 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
27310 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
27320 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
27330 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
27340 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27350 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
27360 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
27370 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
27380 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27390 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
273a0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
273b0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
273c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
273d0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
273e0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
273f0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
27400 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
27410 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
27420 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
27430 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
27440 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
27450 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
27460 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
27470 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
27480 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27490 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
274a0 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
274b0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
274c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
274d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
274e0 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
274f0 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
27500 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27510 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
27520 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
27530 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
27540 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
27550 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
27560 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
27570 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
27580 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27590 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
275a0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
275b0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
275c0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
275d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
275e0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
275f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
27600 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
27610 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
27620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
27630 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
27640 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
27650 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
27660 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
27670 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
27680 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
27690 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
276a0 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
276b0 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
276c0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
276d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
276e0 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
276f0 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
27700 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
27710 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
27720 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
27730 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
27740 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
27750 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
27760 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
27770 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
27780 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
27790 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
277a0 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
277b0 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
277c0 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
277d0 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
277e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
277f0 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
27800 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
27810 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
27820 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
27830 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
27840 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
27850 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
27860 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
27870 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
27880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27890 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
278a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
278b0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
278c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
278d0 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
278e0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
278f0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
27900 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27910 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
27920 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
27930 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
27940 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
27950 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
27960 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
27970 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
27980 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27990 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
279a0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
279b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
279c0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
279d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
279e0 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
279f0 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
27a00 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27a10 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
27a20 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
27a30 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
27a40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
27a50 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
27a60 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
27a70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
27a80 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27a90 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27aa0 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
27ab0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
27ac0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
27ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27ae0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
27af0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
27b00 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
27b10 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27b20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
27b30 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
27b40 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
27b50 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
27b60 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
27b70 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
27b80 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27b90 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27ba0 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
27bb0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
27bc0 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
27bd0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
27be0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
27bf0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
27c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27c10 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27c20 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
27c30 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
27c40 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
27c50 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
27c60 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
27c70 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
27c80 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27c90 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27ca0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
27cb0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
27cc0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
27cd0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
27ce0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
27cf0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
27d00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27d10 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27d20 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27d30 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27d40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27d50 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27d60 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27d70 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27d80 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27d90 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27da0 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
27db0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
27dc0 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
27dd0 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
27de0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27e00 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27e10 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27e20 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27e30 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27e40 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27e50 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27e60 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27e70 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27e80 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27e90 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27ea0 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27eb0 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27ec0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
27ed0 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
27ee0 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
27ef0 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
27f00 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27f10 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27f20 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27f30 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27f40 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27f50 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27f60 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
27f70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27f80 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
27f90 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
27fa0 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
27fb0 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
27fc0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
27fd0 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
27fe0 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
27ff0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
28000 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
28010 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
28020 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
28030 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
28040 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
28050 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
28060 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
28070 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
28080 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
28090 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
280a0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
280b0 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
280c0 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
280d0 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
280e0 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
280f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
28100 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
28110 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
28120 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
28130 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
28140 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
28150 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
28160 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
28170 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
28180 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
28190 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
281a0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
281b0 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
281c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
281d0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
281e0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
281f0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
28200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
28210 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
28220 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
28230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28240 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
28250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28260 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28270 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
28280 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
28290 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
282a0 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
282b0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
282c0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
282d0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
282e0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
282f0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
28300 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
28310 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
28320 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
28330 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28340 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
28350 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
28360 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
28370 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
28380 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
28390 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
283a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
283b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
283c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
283d0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
283e0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
283f0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
28400 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
28410 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
28420 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28430 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
28440 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
28450 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
28460 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
28470 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
28480 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
28490 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
284a0 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
284b0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
284c0 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
284d0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
284e0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
284f0 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
28500 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
28510 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28520 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
28530 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
28540 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
28550 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
28560 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
28570 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
28580 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
28590 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
285a0 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
285b0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
285c0 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
285d0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
285e0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
285f0 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
28600 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
28610 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
28620 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
28630 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
28640 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
28650 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
28660 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
28670 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
28680 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
28690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
286a0 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
286b0 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
286c0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
286d0 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
286e0 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
286f0 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
28700 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
28710 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
28720 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
28730 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
28740 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
28750 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
28760 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
28770 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
28780 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
28790 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
287a0 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
287b0 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
287c0 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
287d0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
287e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
287f0 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
28800 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
28810 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
28820 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
28830 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
28840 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
28850 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
28860 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
28870 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
28880 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
28890 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
288a0 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
288b0 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
288c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
288d0 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
288e0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
288f0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
28900 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
28910 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
28920 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
28930 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
28940 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
28950 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
28960 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
28970 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
28980 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
28990 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
289a0 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
289b0 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
289c0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
289d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
289e0 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
289f0 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
28a00 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
28a10 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
28a20 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28a30 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
28a40 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
28a50 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
28a60 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
28a70 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
28a80 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
28a90 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
28aa0 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
28ab0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
28ac0 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
28ad0 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
28ae0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
28af0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28b00 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
28b10 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
28b20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
28b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
28b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
28b50 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
28b60 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
28b70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
28b80 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
28b90 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
28ba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28bb0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28bc0 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
28bd0 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
28be0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
28bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
28c10 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
28c20 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
28c30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28c40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28c50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
28c60 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
28c70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28c80 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
28c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
28ca0 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
28cb0 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
28cc0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
28cd0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
28ce0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
28cf0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
28d00 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
28d10 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28d20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
28d30 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
28d40 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
28d50 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
28d60 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
28d70 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
28d80 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
28d90 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
28da0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
28db0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28dc0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
28dd0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
28de0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
28df0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
28e00 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
28e10 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
28e20 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
28e30 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
28e40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
28e50 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
28e60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
28e70 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
28e80 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
28e90 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
28ea0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
28eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
28ec0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
28ed0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28ee0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
28ef0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
28f00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28f10 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28f20 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28f30 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28f40 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28f50 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28f60 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
28f70 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28f80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28f90 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
28fa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28fb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
28fe0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
28ff0 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
29000 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
29010 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
29020 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29030 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
29040 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
29050 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
29060 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
29070 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
29080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
290a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
290b0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
290c0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
290d0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
290e0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
290f0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
29100 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
29110 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
29120 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
29130 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
29140 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
29150 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
29160 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
29170 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
29180 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
29190 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
291a0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
291b0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
291c0 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
291d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
291e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
291f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29200 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
29210 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
29220 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
29230 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
29240 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
29250 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
29260 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
29270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
29280 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
29290 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
292a0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
292b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
292c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
292d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
292e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
292f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
29300 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
29310 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
29320 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
29330 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
29340 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
29350 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
29360 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
29370 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
29380 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
29390 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
293a0 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
293b0 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
293c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
293d0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
293e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
293f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
29400 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
29410 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
29420 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
29430 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
29440 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29450 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
29460 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
29470 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
29480 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
29490 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
294a0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
294b0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
294c0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
294d0 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
294e0 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
294f0 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
29500 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
29510 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
29520 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
29530 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
29540 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
29550 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
29560 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
29570 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
29580 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
29590 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
295a0 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
295b0 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
295c0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
295d0 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
295e0 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
295f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29600 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
29610 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
29620 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
29630 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
29640 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
29650 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
29660 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
29670 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
29680 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
29690 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
296a0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
296b0 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
296c0 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
296d0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
296e0 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
296f0 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
29700 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
29710 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
29720 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
29730 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
29740 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
29750 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
29760 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
29770 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
29780 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
29790 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
297a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
297b0 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
297c0 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
297d0 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
297e0 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
297f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
29800 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
29810 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
29820 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
29830 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
29840 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
29850 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
29860 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
29870 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
29880 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
29890 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
298a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
298b0 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
298c0 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
298d0 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
298e0 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
298f0 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
29900 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
29910 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
29920 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
29930 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
29940 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
29950 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
29960 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
29970 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
29980 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
29990 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
299a0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
299b0 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
299c0 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
299d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
299e0 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
299f0 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
29a00 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
29a10 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
29a20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
29a30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
29a40 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
29a50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
29a60 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
29a70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29aa0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
29ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
29ac0 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
29ad0 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
29ae0 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
29af0 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
29b00 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
29b10 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
29b20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
29b30 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
29b40 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
29b50 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
29b60 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
29b70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29b80 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29b90 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29ba0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29bb0 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
29bc0 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
29bd0 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
29be0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29bf0 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
29c00 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29c10 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29c20 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
29c30 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
29c40 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
29c50 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29c60 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
29c70 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
29c80 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
29c90 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
29ca0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
29cb0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
29cc0 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
29cd0 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
29ce0 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
29cf0 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
29d00 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
29d10 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
29d20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
29d30 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
29d40 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29d50 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
29d60 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
29d70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29d80 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
29d90 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
29da0 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
29db0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
29dc0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
29dd0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
29de0 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
29df0 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
29e00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29e10 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
29e20 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
29e30 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
29e40 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
29e50 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
29e60 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
29e70 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
29e80 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
29e90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
29ea0 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
29eb0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29ec0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
29ed0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
29ee0 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
29ef0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
29f00 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
29f10 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
29f20 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
29f30 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
29f40 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
29f50 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
29f60 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
29f70 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
29f80 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
29f90 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
29fa0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
29fb0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
29fc0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
29fd0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
29fe0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
29ff0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
2a000 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
2a010 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
2a020 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
2a030 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
2a040 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
2a050 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
2a060 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2a070 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
2a080 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
2a090 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
2a0a0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2a0b0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
2a0c0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
2a0d0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
2a0e0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
2a0f0 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
2a100 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
2a110 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a140 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
2a150 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
2a160 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
2a170 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2a180 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2a190 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
2a1a0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
2a1b0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
2a1c0 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
2a1d0 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
2a1e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2a1f0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2a200 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
2a210 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
2a220 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2a230 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
2a240 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
2a250 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
2a260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a270 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a280 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
2a290 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a2a0 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
2a2b0 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
2a2c0 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
2a2d0 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
2a2e0 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
2a2f0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
2a300 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
2a310 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a320 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
2a330 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
2a340 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
2a350 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a360 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
2a370 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
2a380 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
2a390 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
2a3a0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
2a3b0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
2a3c0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
2a3d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2a3e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a3f0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2a400 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2a410 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a420 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
2a430 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
2a440 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2a450 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
2a460 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
2a470 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
2a480 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
2a490 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a4a0 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
2a4b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
2a4c0 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
2a4d0 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
2a4e0 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
2a4f0 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
2a500 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
2a510 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
2a520 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2a530 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2a540 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2a550 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2a560 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
2a570 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
2a580 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a590 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
2a5a0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2a5b0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2a5c0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
2a5d0 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
2a5e0 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
2a5f0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a600 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a610 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2a620 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
2a630 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
2a640 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
2a650 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
2a660 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a670 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
2a680 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2a690 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
2a6a0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2a6b0 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
2a6c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2a6d0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2a6e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2a6f0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
2a700 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
2a710 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
2a720 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
2a730 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a740 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
2a750 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
2a760 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
2a770 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
2a780 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2a790 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2a7a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a7b0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2a7c0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2a7d0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2a7e0 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   =  SQLITE_OPEN_
2a7f0 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c  SUBJOURNAL | SQL
2a800 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2a810 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  TE .      | SQLI
2a820 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
2a830 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2a840 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20  LUSIVE .      | 
2a850 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2a860 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69  TEONCLOSE;.    i
2a870 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20  nt nStmtSpill = 
2a880 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
2a890 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66  tmtSpill;.    if
2a8a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2a8b0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2a8c0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2a8d0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2a8e0 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2a8f0 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31   nStmtSpill = -1
2a900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2a910 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2a920 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
2a930 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  , 0, pPager->sjf
2a940 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53  d, flags, nStmtS
2a950 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pill);.  }.  ret
2a960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a970 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
2a980 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2a990 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
2a9a0 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
2a9b0 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal. .**.** If 
2a9c0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2a9d0 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
2a9e0 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
2a9f0 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
2aa00 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
2aa10 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
2aa20 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2aa30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2aa40 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2aa50 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
2aa60 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2aa70 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
2aa80 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
2aa90 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
2aaa0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2aab0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
2aac0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2aad0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
2aae0 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
2aaf0 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
2ab00 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
2ab10 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2ab20 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
2ab30 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
2ab40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
2ab50 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2ab60 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2ab70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ab80 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2ab90 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
2aba0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
2abb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
2abc0 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
2abd0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
2abe0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2abf0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2ac00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ac10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2ac20 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
2ac30 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2ac40 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2ac50 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2ac60 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
2ac70 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2ac80 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2ac90 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2aca0 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
2acb0 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20  al(pPager, pPg) 
2acc0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
2acd0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2ace0 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
2acf0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
2ad00 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2ad10 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2ad20 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
2ad30 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
2ad40 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
2ad50 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
2ad60 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
2ad70 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
2ad80 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
2ad90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ada0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
2adb0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
2adc0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
2add0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
2ade0 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  )pPager->nSubRec
2adf0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
2ae00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
2ae10 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
2ae20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2ae30 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2ae40 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2ae50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2ae60 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2ae70 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2ae80 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2ae90 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2aea0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2aeb0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2aec0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2aed0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2aee0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2aef0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2af00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2af10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2af20 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2af30 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2af40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2af50 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2af60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2af70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2af80 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2af90 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2afa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2afb0 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2afc0 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2afd0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2afe0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2aff0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b000 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2b010 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2b020 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2b030 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2b040 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2b050 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b060 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b070 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2b080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b090 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2b0a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b0b0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2b0c0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2b0d0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2b0e0 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2b0f0 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2b100 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2b110 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2b120 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2b130 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2b140 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2b150 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2b160 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2b170 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2b180 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2b190 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2b1a0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2b1b0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2b1c0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2b1d0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2b1e0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2b1f0 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2b200 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2b210 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2b220 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2b230 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2b240 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2b250 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2b260 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2b270 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2b280 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2b290 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2b2a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b2b0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2b2c0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2b2d0 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2b2e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2b2f0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b300 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2b310 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2b320 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2b330 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2b340 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2b350 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b360 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2b370 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2b380 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2b390 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b3a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2b3b0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2b3c0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2b3d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2b3e0 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2b3f0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2b400 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2b410 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2b420 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b430 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2b440 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2b450 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2b460 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2b470 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2b480 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2b490 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b4a0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2b4b0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2b4c0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2b4d0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2b4e0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2b4f0 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2b500 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2b510 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2b520 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2b530 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2b540 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2b550 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2b560 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2b570 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2b580 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2b590 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b5a0 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2b5b0 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2b5c0 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2b5d0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2b5e0 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2b5f0 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2b600 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2b610 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2b620 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2b630 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2b640 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2b650 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2b660 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2b670 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2b680 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2b690 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2b6a0 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2b6b0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2b6c0 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2b6d0 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2b6e0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2b6f0 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2b700 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2b710 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2b720 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2b730 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2b740 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2b750 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2b760 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2b770 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2b780 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2b790 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2b7a0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b7b0 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2b7c0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2b7d0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2b7e0 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2b7f0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2b800 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2b810 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2b820 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2b830 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2b840 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2b850 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2b860 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2b870 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2b880 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2b890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b8a0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b8b0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b8c0 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2b8d0 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2b8e0 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b8f0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b900 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2b910 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b920 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b930 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2b940 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2b950 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2b960 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b970 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2b980 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2b990 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2b9a0 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2b9b0 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2b9c0 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2b9d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b9e0 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b9f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2ba00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2ba10 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2ba20 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2ba30 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2ba40 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2ba50 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2ba60 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2ba70 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2ba80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2baa0 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2bab0 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2bac0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2bad0 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2bae0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2baf0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2bb00 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2bb10 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2bb20 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2bb30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2bb40 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2bb50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2bb60 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2bb70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2bb80 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2bb90 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2bba0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2bbb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bbc0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2bbd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bbe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2bbf0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2bc00 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2bc10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2bc20 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2bc30 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2bc40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2bc50 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2bc60 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2bc70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bc80 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2bc90 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2bca0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2bcb0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2bcc0 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2bcd0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2bce0 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2bcf0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2bd00 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2bd10 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2bd20 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2bd30 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2bd40 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2bd50 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2bd60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2bd70 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2bd80 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2bd90 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2bda0 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2bdb0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2bdc0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2bdd0 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2bde0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2bdf0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2be00 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2be10 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2be20 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2be30 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2be40 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2be50 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2be60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2be70 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2be80 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2be90 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2bea0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2beb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2bec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bed0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2bee0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2bef0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2bf00 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2bf10 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2bf20 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2bf30 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2bf40 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2bf50 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2bf60 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2bf70 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2bf80 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2bf90 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2bfa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bfb0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2bfc0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2bfd0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2bfe0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2bff0 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2c000 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2c010 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2c020 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2c030 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2c040 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2c050 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2c060 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2c070 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2c080 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2c090 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2c0a0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2c0b0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2c0c0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2c0d0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2c0e0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2c0f0 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2c100 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2c110 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2c120 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2c130 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2c140 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2c150 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2c160 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2c170 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2c180 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2c190 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2c1a0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2c1b0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2c1c0 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2c1d0 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2c1e0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2c1f0 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2c200 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2c210 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2c220 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2c230 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2c240 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2c250 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2c260 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2c270 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2c280 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2c290 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2c2a0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2c2b0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2c2c0 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2c2d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2c2e0 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2c2f0 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2c300 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2c310 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2c320 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2c330 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2c340 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2c350 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c360 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2c370 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2c380 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2c390 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2c3a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2c3b0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2c3c0 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2c3d0 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2c3e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2c3f0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2c400 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2c410 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2c420 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2c430 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2c440 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2c450 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2c460 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2c470 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2c480 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2c490 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2c4a0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2c4b0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2c4c0 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2c4d0 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2c4e0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2c4f0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2c500 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2c510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2c520 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2c530 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2c540 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2c550 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2c560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2c570 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2c580 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2c590 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2c5a0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2c5b0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2c5c0 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2c5d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2c5e0 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2c5f0 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2c600 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2c610 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2c620 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2c630 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2c640 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2c650 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2c660 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2c670 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2c680 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2c690 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2c6a0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2c6b0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2c6c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c6d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c6e0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c6f0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c700 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c710 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c720 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c730 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c740 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c750 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c760 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c770 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c780 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c790 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c7a0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c7b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c7c0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c7d0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c7e0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c7f0 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c800 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c810 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c820 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c830 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c840 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c850 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c860 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c870 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c880 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c890 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c8a0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c8b0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c8c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c8d0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c8e0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c8f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c900 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c910 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c920 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c930 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c940 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c950 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c960 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c970 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c980 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c990 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c9a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c9b0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c9c0 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c9d0 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c9e0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c9f0 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2ca00 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2ca10 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2ca20 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2ca30 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2ca40 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2ca50 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2ca60 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e  al).  */.  journ
2ca70 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2ca80 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2ca90 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a  alSize(pVfs));..
2caa0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2cab0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2cac0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2cad0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2cae0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2caf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2cb00 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2cb10 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2cb20 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2cb30 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2cb40 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2cb50 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2cb60 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2cb70 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2cb80 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2cb90 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2cba0 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2cbb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2cbc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74  BKPT;.      nPat
2cbd0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2cbe0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2cbf0 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2cc00 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2cc10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2cc20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2cc30 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2cc40 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2cc50 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2cc60 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2cc70 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2cc80 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2cc90 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2cca0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2ccb0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2ccc0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2ccd0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2cce0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2ccf0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2cd00 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2cd10 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2cd20 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2cd30 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2cd40 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2cd50 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2cd60 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2cd70 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2cd80 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2cd90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2cda0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2cdb0 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2cdc0 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2cdd0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2cde0 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2cdf0 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2ce00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2ce10 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2ce20 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2ce30 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2ce40 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2ce50 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2ce60 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2ce70 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2ce80 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2ce90 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2cea0 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2ceb0 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2cec0 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2ced0 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2cee0 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2cef0 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2cf00 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2cf10 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2cf20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2cf30 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2cf40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cf50 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2cf60 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2cf70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2cf80 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2cf90 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2cfa0 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2cfb0 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2cfc0 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2cfd0 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2cfe0 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2cff0 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2d000 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2d010 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2d020 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2d030 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2d040 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2d050 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2d060 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2d070 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2d080 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2d090 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2d0a0 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2d0b0 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2d0c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2d0d0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2d0e0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2d0f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d110 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d120 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2d140 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2d150 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2d160 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2d170 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2d180 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2d190 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2d1a0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2d1b0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2d1c0 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2d1d0 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2d1e0 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2d1f0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2d200 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2d230 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2d240 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d260 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2d270 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2d280 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2d290 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2d2a0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2d2b0 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2d2c0 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2d2d0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2d2e0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d2f0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d300 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2d310 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2d320 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d330 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d340 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2d350 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2d360 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2d370 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2d380 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2d390 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2d3a0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2d3b0 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2d3c0 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2d3d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2d3e0 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2d3f0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2d400 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2d410 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2d420 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d430 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2d440 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2d450 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2d460 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2d470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2d480 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2d490 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d4a0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2d4b0 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2d4c0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2d4d0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d4e0 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2d4f0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2d500 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d510 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2d520 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2d530 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2d540 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2d550 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2d560 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2d570 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2d580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2d590 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d5a0 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2d5b0 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2d5c0 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2d5d0 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2d5e0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d5f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2d600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d610 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  M_BKPT;.  }.  pP
2d620 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2d630 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2d640 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2d650 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2d660 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2d670 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2d680 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2d690 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2d6a0 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d6b0 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d6c0 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2d6d0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2d6e0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2d6f0 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2d700 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2d710 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2d720 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d730 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d740 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2d750 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2d760 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d770 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2d780 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2d790 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2d7a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2d7b0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2d7c0 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2d7d0 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2d7e0 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2d7f0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2d800 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2d810 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2d820 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2d830 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2d840 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2d850 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d860 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d870 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2d880 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2d890 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d8a0 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2d8b0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2d8c0 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2d8d0 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2d8e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d8f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2d900 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d910 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d920 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2d930 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d940 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2d950 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2d960 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d970 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d980 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2d990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d9a0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2d9b0 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2d9c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d9d0 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2d9e0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d9f0 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2da00 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2da10 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2da20 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2da30 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2da40 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2da50 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2da60 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2da70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2da80 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2da90 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2daa0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2dab0 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2dac0 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2dad0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2dae0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2daf0 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2db00 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2db10 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2db20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2db30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2db40 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2db50 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2db60 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2db70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2db80 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2db90 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2dba0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2dbb0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2dbc0 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2dbd0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2dbe0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2dbf0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2dc00 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2dc10 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2dc20 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2dc30 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2dc40 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2dc50 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2dc60 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2dc70 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2dc80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2dc90 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2dca0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2dcb0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2dcc0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2dcd0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2dce0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2dcf0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2dd00 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2dd10 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2dd20 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2dd30 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2dd40 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2dd50 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2dd60 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2dd70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2dd80 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2dd90 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2dda0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2ddb0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2ddc0 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2ddd0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2dde0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2ddf0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2de00 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2de10 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2de20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2de30 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2de40 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2de50 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2de60 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2de70 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2de80 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2de90 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dea0 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2deb0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2dec0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2ded0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dee0 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2def0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2df00 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2df10 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2df20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2df30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2df40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2df50 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2df60 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2df70 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2df80 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2df90 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2dfa0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2dfb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2dfc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2dfd0 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2dfe0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2dff0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2e000 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e010 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2e020 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2e030 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2e040 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2e050 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2e060 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2e070 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2e080 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2e090 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2e0a0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2e0b0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2e0c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e0d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2e0e0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2e0f0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2e100 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2e110 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2e120 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2e130 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2e140 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2e150 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2e160 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2e170 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2e180 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2e190 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2e1a0 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2e1b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e1c0 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2e1d0 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2e1e0 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2e1f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2e200 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2e210 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2e220 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2e230 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2e240 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2e250 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2e260 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2e270 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2e280 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2e290 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2e2a0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2e2b0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2e2c0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2e2d0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2e2e0 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2e2f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2e300 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2e310 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2e320 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2e330 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2e340 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2e350 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2e360 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2e370 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2e380 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2e390 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e3a0 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2e3b0 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2e3c0 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2e3d0 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2e3e0 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2e3f0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2e400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2e410 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2e420 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
2e430 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
2e440 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
2e450 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2e460 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2e470 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
2e480 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
2e490 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
2e4a0 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e4b0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2e4c0 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2e4d0 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2e4e0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2e4f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e500 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2e510 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2e520 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2e530 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2e540 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2e550 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2e560 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2e570 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2e580 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2e590 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2e5a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e5b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e5c0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2e5d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e5e0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2e5f0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2e600 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2e610 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2e620 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2e630 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2e640 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2e650 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2e660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e670 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
2e680 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78  <1000 );.    nEx
2e690 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2e6a0 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tra);.    rc = s
2e6b0 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2e6c0 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2e6d0 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6f0 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
2e700 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
2e710 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
2e720 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
2e730 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2e740 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  r occurred above
2e750 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65  , free the  Page
2e760 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
2e770 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
2e780 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
2e790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e7a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2e7b0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2e7c0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
2e7d0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2e7e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2e7f0 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
2e800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e810 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2e820 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
2e830 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
2e840 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
2e850 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
2e860 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
2e870 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
2e880 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e890 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
2e8a0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
2e8b0 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
2e8c0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
2e8d0 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
2e8e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
2e8f0 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
2e900 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
2e910 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e920 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
2e930 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e940 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
2e950 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e960 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
2e970 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
2e980 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
2e990 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
2e9a0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2e9b0 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
2e9c0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2e9d0 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2e9e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2e9f0 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2ea00 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2ea10 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2ea20 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2ea30 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2ea40 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2ea50 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2ea60 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2ea70 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2ea80 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2ea90 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2eaa0 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2eab0 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2eac0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2ead0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2eae0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2eaf0 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2eb00 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2eb10 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2eb20 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2eb30 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2eb40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2eb50 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2eb60 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2eb70 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
2eb80 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
2eb90 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
2eba0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2ebb0 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  gs = pPager->noS
2ebc0 79 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54 45  ync ? 0 : SQLITE
2ebd0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2ebe0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2ebf0 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e  Flags = pPager->
2ec00 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28  syncFlags;.  if(
2ec10 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2ec20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ec30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2ec40 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ec50 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53  ( pPager->extraS
2ec60 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2ec70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2ec80 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2ec90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eca0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2ecb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ecc0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2ecd0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2ece0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2ecf0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2ed00 23 69 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  #if SQLITE_EXTRA
2ed10 5f 44 55 52 41 42 4c 45 0a 20 20 20 20 70 50 61  _DURABLE.    pPa
2ed20 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
2ed30 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 50   1;.#else.    pP
2ed40 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
2ed50 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 0;.#endif.    
2ed60 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2ed70 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2ed80 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
2ed90 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2eda0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2edb0 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43  ORMAL | WAL_SYNC
2edc0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
2edd0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
2ede0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2edf0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2ee00 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2ee10 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2ee20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2ee30 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2ee40 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2ee50 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2ee60 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2ee70 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2ee80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2ee90 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2eea0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2eeb0 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2eec0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2eed0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2eee0 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2eef0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2ef00 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2ef10 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2ef20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2ef30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2ef40 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2ef50 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
2ef60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2ef70 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2ef80 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
2ef90 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2efa0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
2efb0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2efc0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
2efd0 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
2efe0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
2eff0 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
2f000 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2f010 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2f020 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2f030 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f040 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  szMmap = SQLITE_
2f050 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a  DEFAULT_MMAP_SIZ
2f060 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74  E // will be set
2f070 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a   by btree.c */..
2f080 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2f090 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2f0a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
2f0b0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2f0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
2f0d0 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  s not be deleted
2f0e0 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20   or renamed out 
2f0f0 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68  from.** under th
2f100 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  e pager.  Return
2f110 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2f120 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
2f130 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68  ill were it ough
2f140 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69  t.** to be on di
2f150 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  sk.  Return non-
2f160 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41  zero (SQLITE_REA
2f170 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72  DONLY_DBMOVED or
2f180 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
2f190 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73  r.** code from s
2f1a0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2f1b0 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
2f1c0 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69  e has gone missi
2f1d0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2f1e0 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  t databaseIsUnmo
2f1f0 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  ved(Pager *pPage
2f200 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f  r){.  int bHasMo
2f210 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ved = 0;.  int r
2f220 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
2f230 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74  ->tempFile ) ret
2f240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2f260 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ize==0 ) return 
2f270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2f280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69  ert( pPager->zFi
2f290 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72  lename && pPager
2f2a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ->zFilename[0] )
2f2b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2f2c0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
2f2d0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2f2e0 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
2f2f0 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20  , &bHasMoved);. 
2f300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f310 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
2f320 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f  /* If the HAS_MO
2f330 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  VED file-control
2f340 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65   is unimplemente
2f350 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  d, assume that t
2f360 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68  he file.    ** h
2f370 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65  as not been move
2f380 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20  d.  That is the 
2f390 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76  historical behav
2f3a0 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70  ior of SQLite: p
2f3b0 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76  rior to.    ** v
2f3c0 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74  ersion 3.8.3, it
2f3d0 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a   never checked *
2f3e0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
2f3f0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2f400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f410 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a  && bHasMoved ){.
2f420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f430 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2f440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f450 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
2f460 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f470 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2f480 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2f490 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2f4a0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2f4b0 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2f4c0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2f4d0 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2f4e0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2f4f0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2f500 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2f510 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2f520 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2f530 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2f540 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2f550 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2f560 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2f570 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2f580 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2f590 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2f5a0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2f5b0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f5c0 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2f5d0 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2f5e0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2f5f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2f600 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2f610 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2f620 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2f630 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2f640 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2f650 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2f660 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2f670 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2f680 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2f690 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2f6a0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2f6b0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2f6c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2f6d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2f6e0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2f6f0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2f700 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2f710 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2f720 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2f730 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2f740 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2f750 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2f760 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2f770 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2f780 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2f790 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2f7a0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2f7b0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2f7c0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2f7d0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2f7e0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2f7f0 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2f800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2f810 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2f820 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2f830 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2f840 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2f850 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2f860 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2f870 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f880 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2f890 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2f8a0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2f8b0 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2f8c0 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2f8d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f8e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2f8f0 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2f900 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f910 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2f920 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2f930 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2f940 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2f950 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2f960 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2f970 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2f980 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2f990 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f9a0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2f9b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2f9c0 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2f9d0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2f9e0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2f9f0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2fa00 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2fa10 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2fa20 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2fa30 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2fa40 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2fa50 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2fa60 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2fa70 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2fa80 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2fa90 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2faa0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2fab0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2fac0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2fad0 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2fae0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2faf0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2fb00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2fb10 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2fb20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2fb30 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2fb40 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2fb50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2fb60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2fb70 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2fb80 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2fb90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2fba0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2fbb0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2fbc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2fbd0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2fbe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2fbf0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2fc00 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2fc10 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2fc20 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2fc30 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2fc40 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2fc50 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2fc60 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2fc70 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2fc80 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2fc90 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2fca0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2fcb0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2fcc0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2fcd0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2fce0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2fcf0 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2fd00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fd10 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2fd20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd40 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2fd50 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2fd60 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2fd70 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2fd80 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2fd90 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2fda0 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2fdb0 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2fdc0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2fdd0 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2fde0 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2fdf0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2fe00 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2fe10 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2fe20 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2fe30 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2fe40 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2fe50 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2fe60 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2fe70 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2fe80 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2fe90 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2fea0 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2feb0 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2fec0 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2fed0 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2fee0 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2fef0 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2ff00 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2ff10 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2ff20 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2ff30 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2ff40 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2ff50 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2ff60 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2ff70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2ff80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ff90 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2ffa0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2ffb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ffc0 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2ffd0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fff0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30000 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
30010 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  e */..      rc =
30020 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
30030 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
30040 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
30050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30060 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
30070 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70  tabase is zero p
30080 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ages in size, th
30090 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  at means that ei
300a0 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20  ther (1) the.   
300b0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
300c0 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f  is a remnant fro
300d0 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61  m a prior databa
300e0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
300f0 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20   name where.    
30100 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
30110 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74  ase file but not
30120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
30130 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29   deleted, or (2)
30140 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20   the initial.   
30150 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
30160 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74  ion that populat
30170 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  es a new databas
30180 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
30190 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  d back..        
301a0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
301b0 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
301c0 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74  ile can be delet
301d0 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61  ed.  However, ta
301e0 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20  ke care.        
301f0 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65  ** not to delete
30200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30210 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
30220 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20  dy open due to. 
30230 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
30240 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a  l_mode=PERSIST..
30250 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30260 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
30270 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  && !jrnlOpen ){.
30280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30290 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
302a0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
302b0 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
302c0 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
302d0 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
302e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
302f0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
30300 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
30310 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
30320 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
30330 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
30340 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
30350 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
30360 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
30370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30380 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
30390 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
303a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
303b0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
303c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
303d0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
303e0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
303f0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
30400 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
30410 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
30420 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
30430 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
30440 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
30450 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
30460 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
30470 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
30480 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
30490 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
304a0 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
304b0 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
304c0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
304d0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
304e0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
304f0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
30500 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
30510 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
30520 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
30530 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
30540 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
30550 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
30560 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
30570 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
30580 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
30590 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
305a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
305b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
305c0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
305d0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
305e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
305f0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
30600 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30610 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
30620 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
30630 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
30640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
30660 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
30670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30680 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
30690 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
306a0 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
306b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
306c0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
306d0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
306e0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
306f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
30700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30710 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
30720 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30730 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
30740 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
30750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
30760 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
30770 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
30780 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
30790 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
307a0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
307b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
307c0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
307d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
307e0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
307f0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
30800 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
30810 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
30820 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
30830 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
30840 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
30850 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
30860 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
30870 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
30880 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
30890 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
308a0 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
308b0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
308c0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
308d0 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
308e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
308f0 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
30900 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
30910 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
30920 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
30930 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
30940 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
30950 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
30960 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
30970 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
30980 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
30990 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
309a0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
309b0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
309c0 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
309d0 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
309e0 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
309f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30a00 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
30a10 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
30a20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30a30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30a50 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
30a60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
30a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
30a80 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
30a90 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
30aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30ab0 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
30ac0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
30ad0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75  ite3PagerGet() u
30ae0 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
30af0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
30b00 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
30b10 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
30b20 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
30b30 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
30b40 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
30b50 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
30b60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
30b70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
30b80 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
30b90 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
30ba0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
30bb0 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
30bc0 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
30bd0 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
30be0 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
30bf0 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
30c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30c10 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
30c20 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
30c30 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
30c40 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
30c50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30c60 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
30c70 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
30c80 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
30c90 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
30ca0 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
30cb0 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
30cc0 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
30cd0 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
30ce0 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
30cf0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
30d00 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
30d10 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
30d20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30d30 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
30d40 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
30d50 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
30d60 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
30d70 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
30d80 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
30d90 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
30da0 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
30db0 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
30dc0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
30dd0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
30de0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
30df0 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
30e00 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
30e10 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
30e20 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
30e30 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
30e40 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
30e50 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
30e60 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
30e70 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
30e80 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
30e90 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
30ea0 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
30eb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30ec0 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
30ed0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
30ee0 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
30ef0 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
30f00 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
30f10 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
30f20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
30f30 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
30f40 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
30f50 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
30f60 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
30f70 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
30f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
30f90 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
30fa0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
30fb0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
30fc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
30fd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
30fe0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
30ff0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
31000 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
31010 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
31020 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
31030 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
31040 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
31050 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
31060 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
31070 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
31080 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
31090 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
310a0 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
310b0 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
310c0 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
310d0 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
310e0 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
310f0 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
31100 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
31110 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
31120 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a  access mode..  *
31130 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
31140 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
31150 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
31160 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e)==0 );.  asser
31170 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
31180 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
31190 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
311a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
311b0 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
311c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
311d0 45 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e  EADER );.  if( N
311e0 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
311f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
31200 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
31210 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69  >errCode; }..  i
31220 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
31230 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
31240 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31250 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74  _OPEN ){.    int
31260 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31   bHotJournal = 1
31270 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
31280 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
31290 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ts a hot journal
312a0 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73  -file */..    as
312b0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
312c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
312d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
312e0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
312f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31310 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31320 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
31330 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
31340 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
31350 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  );.      goto fa
31360 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
31370 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
31380 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
31390 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
313a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
313b0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
313c0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
313d0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
313e0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
313f0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
31400 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
31410 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  r->eLock<=SHARED
31420 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
31430 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
31440 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a  l(pPager, &bHotJ
31450 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
31460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
31480 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  to failed;.    }
31490 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75  .    if( bHotJou
314a0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  rnal ){.      if
314b0 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
314c0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
314d0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
314e0 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  LY_ROLLBACK;.   
314f0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31500 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31510 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
31520 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
31530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31540 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
31550 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
31560 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
31570 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
31580 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
31590 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
315a0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
315b0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
315c0 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
315d0 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
315e0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
315f0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
31600 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
31610 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
31620 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
31630 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
31640 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
31650 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
31660 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
31670 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
31680 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
31690 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
316a0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
316b0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
316c0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
316d0 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
316e0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
316f0 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
31700 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
31710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
31720 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
31730 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
31740 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
31750 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
31760 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
31770 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
31780 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31790 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
317a0 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68      ** Unless th
317b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f  e pager is in lo
317c0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
317d0 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c  sive mode, the l
317e0 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ock is.      ** 
317f0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48  downgraded to SH
31800 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65  ARED_LOCK before
31810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
31820 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f  eturns..      */
31830 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
31840 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
31850 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
31860 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31880 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31890 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
318a0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   /* If it is not
318b0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e   already open an
318c0 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  d the file exist
318d0 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20  s on disk, open 
318e0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
318f0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
31900 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69  rite access. Wri
31910 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71  te access is req
31920 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20  uired because . 
31930 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75       ** in exclu
31940 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
31950 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
31960 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
31970 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a  t open .      **
31980 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73   and possibly us
31990 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
319a0 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41  tion later on. A
319b0 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73  lso, write-acces
319c0 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  s .      ** is u
319d0 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  sually required 
319e0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
319f0 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e  journal in journ
31a00 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20  al_mode=persist 
31a10 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28  .      ** mode (
31a20 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75  and also for jou
31a30 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61  rnal_mode=trunca
31a40 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  te on some syste
31a50 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ms)..      **.  
31a60 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f      ** If the jo
31a70 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
31a80 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
31a90 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
31aa0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72   .      ** other
31ab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   connection mana
31ac0 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e  ged to get in an
31ad0 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62  d roll it back b
31ae0 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  efore .      ** 
31af0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
31b00 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
31b10 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
31b20 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
31b30 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
31b40 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
31b50 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
31b60 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
31b70 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
31b80 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
31b90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
31ba0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
31bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31bc0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
31bd0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
31be0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
31bf0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
31c00 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20  ger->pVfs;.     
31c10 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20     int bExists; 
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c30 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
31c40 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
31c50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31c60 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
31c70 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
31c80 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31c90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
31ca0 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29  XISTS, &bExists)
31cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
31cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
31cd0 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
31ce0 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
31cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
31d00 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  f = .#if SQLITE_
31d10 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
31d20 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ECTION.         
31d30 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
31d40 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
31d50 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
31d60 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
31d70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
31d80 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
31d90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31da0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
31db0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
31dc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
31dd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31de0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
31df0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
31e00 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
31e10 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
31e20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31e30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
31e40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
31e50 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
31e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31e70 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
31e80 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
31e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
31eb0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
31ec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
31ed0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
31ee0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
31ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f00 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
31f10 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
31f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
31f30 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
31f40 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
31f50 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
31f60 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
31f70 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
31f80 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
31f90 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
31fa0 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
31fb0 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
31fc0 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
31fd0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
31fe0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
31ff0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
32000 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
32010 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
32020 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
32030 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
32040 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
32050 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
32060 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
32070 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
32080 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
32090 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
320a0 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
320b0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
320c0 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
320d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
320e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
320f0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
32100 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
32110 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
32120 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
32130 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
32140 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32160 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
32170 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
32180 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
32190 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
321a0 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
321b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
321c0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
321d0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
321e0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
321f0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
32200 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
32210 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32230 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
32240 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
32250 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
32260 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
32270 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
32280 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
32290 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
322a0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
322b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
322c0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
322d0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
322e0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
322f0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
32300 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
32310 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
32320 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
32330 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
32340 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
32350 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
32360 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
32370 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
32380 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
32390 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
323a0 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
323b0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
323c0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
323d0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
323e0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
323f0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
32400 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
32410 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
32420 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
32430 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
32440 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
32450 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
32460 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
32470 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
32480 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
32490 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
324a0 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
324b0 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
324c0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
324d0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
324e0 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
324f0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
32500 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
32510 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
32520 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
32530 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
32540 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
32550 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
32560 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
32570 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
32580 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
32590 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
325a0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
325b0 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
325c0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
325d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
325e0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
325f0 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
32600 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
32610 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
32620 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
32630 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
32640 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
32650 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
32660 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
32670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
32680 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
32690 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
326a0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
326b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
326c0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
326d0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
326e0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
326f0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
32700 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65  empFile && pPage
32710 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
32720 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
32730 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
32740 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
32750 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65  cquired then che
32760 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
32770 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
32780 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
32790 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
327a0 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
327b0 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  ed,.      ** flu
327c0 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
327d0 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64  he hasHeldShared
327e0 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e  Lock flag preven
327f0 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  ts this from.   
32800 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20     ** occurring 
32810 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73  on the very firs
32820 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69  t access to a fi
32830 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  le, in order to 
32840 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
32850 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61  single unnecessa
32860 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  ry sqlite3OsRead
32870 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73  () call at the s
32880 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a  tart-up..      *
32890 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
328a0 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  ase changes are 
328b0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
328c0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
328d0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
328e0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
328f0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
32900 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
32910 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
32920 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
32930 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
32940 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
32950 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
32960 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
32970 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
32980 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
32990 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
329a0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
329b0 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
329c0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
329d0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
329e0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
329f0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
32a00 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
32a10 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
32a20 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
32a30 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
32a40 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
32a50 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
32a60 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
32a70 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
32a80 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   */.      Pgno n
32a90 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
32aa0 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
32ab0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
32ac0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20  bFileVers)];..  
32ad0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
32ae0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
32af0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
32b00 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69  f( rc ) goto fai
32b10 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  led;..      if( 
32b20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20  nPage>0 ){.     
32b30 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
32b40 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
32b50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
32b60 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
32b70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32b80 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
32b90 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
32ba0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32bb0 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
32bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32bd0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
32be0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
32bf0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  D ){.          g
32c00 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
32c10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
32c20 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
32c30 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
32c40 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32c50 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
32c60 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
32c70 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
32c80 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
32c90 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
32ca0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
32cb0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
32cc0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
32cd0 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74  /* Unmap the dat
32ce0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69  abase file. It i
32cf0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
32d00 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73  external process
32d10 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  es.        ** ma
32d20 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64  y have truncated
32d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32d40 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65  le and then exte
32d50 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20  nded it back.   
32d60 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f       ** to its o
32d70 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69  riginal size whi
32d80 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
32d90 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20  was not holding 
32da0 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  a lock..        
32db0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
32dc0 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20  there may exist 
32dd0 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70  a Pager.pMap map
32de0 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72  ping that appear
32df0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  s.        ** to 
32e00 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  be the right siz
32e10 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74  e but is not act
32e20 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f  ually valid. Avo
32e30 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  id this.        
32e40 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62  ** possibility b
32e50 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20  y unmapping the 
32e60 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  db here. */.    
32e70 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
32e80 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
32e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
32ea0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
32eb0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  d, 0, 0);.      
32ec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32ed0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
32ee0 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65  re is a WAL file
32ef0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
32f00 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64  tem, open this d
32f10 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20  atabase in WAL. 
32f20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65     ** mode. Othe
32f30 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  rwise, the follo
32f40 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  wing function ca
32f50 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
32f60 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
32f70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
32f80 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69  sent(pPager);.#i
32f90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32fa0 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74  T_WAL.    assert
32fb0 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
32fc0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
32fd0 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  OK );.#endif.  }
32fe0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
32ff0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
33000 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
33010 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
33020 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
33030 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
33040 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
33050 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
33060 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
33070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33080 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
33090 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
330a0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
330b0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
330c0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
330d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
330e0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
330f0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
33100 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
33110 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33120 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
33130 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33140 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33150 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
33160 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65     pPager->hasHe
33170 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31  ldSharedLock = 1
33180 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
331a0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
331b0 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
331c0 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
331d0 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
331e0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
331f0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
33200 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
33210 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
33220 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
33230 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
33240 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
33250 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
33260 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
33270 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
33280 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
33290 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
332a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
332b0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
332c0 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
332d0 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
332e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
332f0 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f  ( pPager->nMmapO
33300 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65  ut==0 && (sqlite
33310 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
33320 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
33330 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65  ==0) ){.    page
33340 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
33350 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
33360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
33370 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
33380 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
33390 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
333a0 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
333b0 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
333c0 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
333d0 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
333e0 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
333f0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
33400 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
33410 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
33420 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
33430 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
33440 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
33450 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
33460 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
33470 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
33480 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
33490 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
334a0 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
334b0 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
334c0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
334d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
334e0 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
334f0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
33500 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
33510 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
33520 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
33530 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
33540 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
33550 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
33560 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
33570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
33580 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
33590 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
335a0 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
335b0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
335c0 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
335d0 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
335e0 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
335f0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
33600 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
33610 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
33620 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
33630 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
33640 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
33650 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
33660 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
33670 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
33680 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
33690 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
336a0 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
336b0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
336c0 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
336d0 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
336e0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
336f0 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
33700 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
33710 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
33720 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
33730 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
33740 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
33750 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
33760 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
33770 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
33780 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
33790 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
337a0 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
337b0 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
337c0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
337d0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
337e0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
337f0 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
33800 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
33810 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
33820 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
33830 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20  **.**   a) When 
33840 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c  reading a free-l
33850 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72  ist leaf page fr
33860 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  om the database,
33870 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20   and.**.**   b) 
33880 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
33890 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
338a0 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65   back and we nee
338b0 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20  d to load.**    
338c0 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74    a new page int
338d0 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 62  o the cache to b
338e0 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  e filled with th
338f0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
33900 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
33910 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
33920 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
33930 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
33940 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
33950 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
33960 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
33970 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
33980 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
33990 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
339a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
339b0 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
339c0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
339d0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
339e0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
339f0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
33a00 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
33a10 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
33a20 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
33a30 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
33a40 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
33a50 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
33a60 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
33a70 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
33a80 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
33a90 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
33aa0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
33ab0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
33ac0 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
33ad0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
33ae0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
33af0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
33b00 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
33b10 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
33b20 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
33b30 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
33b40 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
33b50 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
33b60 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
33b70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
33b80 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
33b90 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
33ba0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
33bb0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
33bc0 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
33bd0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
33be0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
33bf0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
33c00 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
33c10 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
33c20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
33c30 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
33c40 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
33c50 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
33c60 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
33c70 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
33c80 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
33c90 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
33ca0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
33cb0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
33cc0 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
33cd0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
33ce0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
33cf0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
33d00 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
33d10 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
33d20 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
33d30 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
33d40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
33d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33d60 65 72 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a  erGet(.  Pager *
33d70 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
33d80 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
33d90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
33da0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
33db0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
33dc0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
33dd0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
33de0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
33df0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
33e00 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
33e10 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
33e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
33e30 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
33e40 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
33e50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
33e60 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
33e70 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
33e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33e90 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
33ea0 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
33eb0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
33ec0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61  noContent = (fla
33ed0 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e  gs & PAGER_GET_N
33ee0 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a  OCONTENT);..  /*
33ef0 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c   It is acceptabl
33f00 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d  e to use a read-
33f10 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65  only (mmap) page
33f20 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78   for any page ex
33f30 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31  cept.  ** page 1
33f40 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
33f50 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
33f60 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43  n open or the AC
33f70 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20  QUIRE_READONLY. 
33f80 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65   ** flag was spe
33f90 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61  cified by the ca
33fa0 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e  ller. And so lon
33fb0 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e  g as the db is n
33fc0 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  ot a .  ** tempo
33fd0 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
33fe0 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  y database.  */.
33ff0 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61    const int bMma
34000 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 20 26 26  pOk = (pgno>1 &&
34010 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
34020 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
34030 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
34040 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73 20  EADER || (flags 
34050 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  & PAGER_GET_READ
34060 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20 53 51  ONLY)).#ifdef SQ
34070 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
34080 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f    && pPager->xCo
34090 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  dec==0.#endif.  
340a0 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a  );..  /* Optimiz
340b0 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64  ation note:  Add
340c0 69 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31  ing the "pgno<=1
340d0 22 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70  " term before "p
340e0 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a  gno==0" here.  *
340f0 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d  * allows the com
34100 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20  piler optimizer 
34110 74 6f 20 72 65 75 73 65 20 74 68 65 20 72 65 73  to reuse the res
34120 75 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e  ults of the "pgn
34130 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69  o>1".  ** test i
34140 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  n the previous s
34150 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76  tatement, and av
34160 6f 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f  oid testing pgno
34170 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ==0 in the.  ** 
34180 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
34190 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e  e pgno is large.
341a0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d   */.  if( pgno<=
341b0 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a  1 && pgno==0 ){.
341c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
341d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
341e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
341f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
34200 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
34210 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
34220 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
34230 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
34240 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20  noContent==0 || 
34250 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a 20  bMmapOk==0 );.. 
34260 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
34270 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
34280 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 49  ck==1 );..  /* I
34290 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
342a0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
342b0 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
342c0 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  or immediately. 
342d0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
342e0 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67   request the pag
342f0 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68  e from the PCach
34300 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66  e layer. */.  if
34310 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
34320 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e!=SQLITE_OK ){.
34330 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
34340 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
34350 65 7b 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  e{.    if( bMmap
34360 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61  Ok && pagerUseWa
34370 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
34380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
34390 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
343a0 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
343b0 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20  &iFrame);.      
343c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
343d0 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
343e0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
343f0 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70  }..    if( bMmap
34400 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20  Ok && iFrame==0 
34410 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
34420 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Data = 0;..     
34430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
34440 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
34450 20 0a 20 20 20 20 20 20 20 20 20 20 28 69 36 34   .          (i64
34460 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67  )(pgno-1) * pPag
34470 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
34480 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
34490 26 70 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a  &pData.      );.
344a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
344b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
344c0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  a ){.        if(
344d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
344e0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a  PAGER_READER ){.
344f0 20 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20            pPg = 
34500 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
34510 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
34520 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34530 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
34540 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
34550 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
34560 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
34570 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b  o, pData, &pPg);
34580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
345a0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
345b0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
345c0 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
345d0 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
345e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
345f0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
34600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
34610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
34620 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
34630 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
34640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34650 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
34660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34680 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34690 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
346a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
346b0 20 20 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69      {.      sqli
346c0 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
346d0 2a 70 42 61 73 65 3b 0a 20 20 20 20 20 20 70 42  *pBase;.      pB
346e0 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ase = sqlite3Pca
346f0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
34700 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34710 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  3);.      if( pB
34720 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
34730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
34740 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28  acheFetchStress(
34750 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34760 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a   pgno, &pBase);.
34770 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34780 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34790 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
347a0 72 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rr;.        if( 
347b0 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pBase==0 ){.    
347c0 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50        pPg = *ppP
347d0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
347e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
347f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
34800 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34810 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34830 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61       pPg = *ppPa
34840 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
34850 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
34860 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34870 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20  gno, pBase);.   
34880 20 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d     assert( pPg!=
34890 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  0 );.    }.  }..
348a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
348b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
348c0 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
348d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
348e0 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
348f0 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
34900 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
34910 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
34920 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
34930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
34940 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
34950 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
34960 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
34970 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
34980 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
34990 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
349a0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
349b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 3d  }.  assert( pPg=
349c0 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20  =(*ppPage) );.  
349d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
349e0 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
349f0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
34a00 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d  ==pPager || pPg-
34a10 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
34a20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72   if( pPg->pPager
34a30 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
34a40 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
34a50 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
34a60 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
34a70 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
34a80 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
34a90 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
34aa0 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
34ab0 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
34ac0 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
34ad0 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
34ae0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
34af0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
34b00 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
34b10 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b  AGER_STAT_HIT]++
34b20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
34b30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
34b40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
34b50 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
34b60 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
34b70 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
34b80 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
34b90 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
34ba0 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  /..    pPg->pPag
34bb0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
34bc0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
34bd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
34be0 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
34bf0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
34c00 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
34c10 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
34c20 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
34c30 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
34c40 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
34c50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
34c60 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
34c70 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
34c80 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
34ca0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
34cb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
34cc0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34cd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
34ce0 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
34cf0 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e  dbSize<pgno || n
34d00 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
34d10 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
34d20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
34d30 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
34d40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34d50 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
34d60 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34d70 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34d80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34d90 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34da0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
34db0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
34dc0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
34dd0 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
34de0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
34df0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
34e00 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
34e10 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
34e20 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
34e30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
34e40 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
34e50 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
34e60 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
34e70 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
34e80 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
34e90 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
34ea0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
34eb0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
34ec0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
34ed0 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
34ee0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
34ef0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34f00 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
34f10 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
34f20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
34f30 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
34f40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
34f50 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
34f60 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
34f70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
34f80 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
34f90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34fa0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34fb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34fc0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34fd0 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
34fe0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
34ff0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
35000 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
35010 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
35020 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35030 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
35040 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35050 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
35060 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
35070 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
35080 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
35090 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
350a0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
350b0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61  se{.      if( pa
350c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
350d0 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  ) && bMmapOk==0 
350e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
350f0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
35100 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
35110 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
35120 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
35140 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35150 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35160 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
35170 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
35180 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
35190 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
351a0 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20  T_MISS]++;.     
351b0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
351c0 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
351d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
351e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
351f0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
35200 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35210 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
35220 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
35230 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
35240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
35250 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35260 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
35270 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
35280 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
35290 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
352a0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
352b0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
352c0 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
352d0 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
352e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
352f0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
35300 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
35310 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
35320 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
35330 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
35340 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
35350 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
35360 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
35370 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
35380 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
35390 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
353a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
353b0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
353c0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
353d0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
353e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
353f0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
35400 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
35410 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
35420 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
35430 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
35440 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
35450 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
35460 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
35470 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35480 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
35490 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
354a0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
354b0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
354c0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
354d0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
354e0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
354f0 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
35500 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
35510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
35520 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
35530 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
35540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
35550 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
35560 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
35570 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
35580 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
35590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
355a0 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
355b0 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
355c0 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
355d0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
355e0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
355f0 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
35600 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
35610 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
35620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
35630 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
35640 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
35650 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
35660 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
35670 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
35680 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
35690 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
356a0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
356b0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
356c0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
356d0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
356e0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
356f0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
35700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
35710 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
35720 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35730 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
35740 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
35750 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61  ger *pPager;.  a
35760 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
35770 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
35780 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
35790 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
357a0 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61  R_MMAP ){.    pa
357b0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
357c0 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
357d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
357e0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
357f0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
35800 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
35810 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
35820 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
35830 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
35840 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
35850 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
35860 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
35870 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35880 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
35890 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
358a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
358b0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
358c0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
358d0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
358e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
358f0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
35900 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
35910 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
35920 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
35930 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
35940 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
35950 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
35960 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
35970 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
35980 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
35990 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
359a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
359b0 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
359c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
359d0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
359e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
359f0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
35a00 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
35a10 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
35a20 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
35a30 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
35a40 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
35a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
35a60 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
35a70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
35a80 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
35a90 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
35aa0 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
35ab0 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
35ac0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35ad0 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
35ae0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
35af0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
35b00 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
35b10 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
35b20 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
35b30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35b40 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
35b50 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
35b60 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
35b70 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
35b80 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
35b90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
35ba0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
35bb0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
35bc0 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
35bd0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
35be0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
35bf0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
35c00 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
35c10 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
35c20 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
35c30 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
35c40 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
35c50 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
35c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35c70 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
35c80 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
35c90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35ca0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35cd0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
35ce0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
35cf0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
35d00 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
35d10 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
35d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35d30 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35d40 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35d50 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35d60 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35d70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
35d80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
35d90 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
35da0 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
35db0 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
35dc0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
35dd0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
35de0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
35df0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
35e00 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
35e10 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
35e20 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
35e30 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
35e40 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
35e50 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
35e60 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
35e70 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
35e80 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
35e90 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
35ea0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
35eb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35ec0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
35ed0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
35ee0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
35ef0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
35f00 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
35f10 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35f20 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
35f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35f40 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
35f50 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
35f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
35f70 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
35f80 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
35f90 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
35fa0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
35fb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
35fc0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
35fd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
35fe0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
35ff0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
36000 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
36010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
36020 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
36030 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
36040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
36050 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
36060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
36070 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
36080 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49  LE_DATA_PROTECTI
36090 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  ON.          (pP
360a0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
360b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
360c0 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
360d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
360e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
360f0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
36100 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
36110 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
36120 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
36130 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
36140 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
36150 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
36160 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
36170 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
36180 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
36190 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
361a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  ..        /* Ver
361b0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
361c0 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
361d0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
361e0 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
361f0 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
36200 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
36210 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
36220 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
36230 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
36240 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36250 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66  ITE_OK ){.#ifdef
36260 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
36270 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
36280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36290 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
362a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
362b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
362c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
362d0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
362e0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
362f0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c            );.#el
36300 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
36310 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
36320 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
36330 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
36340 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
36350 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
36360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
36370 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
36380 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
36390 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
363a0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
363b0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
363c0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
363d0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
363e0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
363f0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
36400 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
36410 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
36420 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36430 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
36440 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
36450 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
36460 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
36470 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
36480 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
36490 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
364a0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
364b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
364c0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
364d0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
364e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
364f0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
36500 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
36510 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
36520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
36530 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
36540 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
36550 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
36560 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
36570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
36580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36590 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
365a0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
365b0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
365c0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
365d0 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
365e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
365f0 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
36600 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
36610 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
36620 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
36630 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
36640 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
36650 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
36660 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
36670 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
36680 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
36690 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
366a0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
366b0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
366c0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
366d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
366e0 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
366f0 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
36700 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
36710 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
36720 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
36730 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
36740 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
36750 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
36760 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
36770 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
36780 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
36790 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
367a0 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
367b0 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
367c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
367d0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
367e0 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
367f0 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
36800 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
36810 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36820 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
36830 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
36840 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
36850 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
36860 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
36870 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
36880 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
36890 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
368a0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
368b0 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
368c0 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
368d0 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
368e0 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
368f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
36900 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
36910 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
36920 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
36930 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
36940 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
36950 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
36960 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
36970 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
36980 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
36990 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
369a0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
369b0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
369c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
369d0 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Code;.  assert( 
369e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
369f0 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
36a00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
36a10 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
36a20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
36a30 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
36a40 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20  nMemory;..  if( 
36a50 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65  ALWAYS(pPager->e
36a60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
36a70 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65  DER) ){.    asse
36a80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
36a90 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  ournal==0 );..  
36aa0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
36ab0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
36ac0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
36ad0 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  er is configured
36ae0 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f   to use locking_
36af0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20  mode=exclusive, 
36b00 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  and an.      ** 
36b10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
36b20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
36b30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
36b40 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f  ld, obtain it no
36b50 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
36b60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
36b70 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73  clusiveMode && s
36b80 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
36b90 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
36ba0 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Wal, -1) ){.    
36bb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
36bc0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
36bd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
36be0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36c00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36c20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
36c30 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
36c40 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
36c50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
36c60 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
36c70 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
36c80 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
36c90 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
36ca0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
36cb0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
36cc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
36cd0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
36ce0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
36cf0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
36d00 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
36d10 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
36d20 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
36d30 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
36d40 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
36d50 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
36d60 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
36d70 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
36d80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
36da0 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
36db0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
36dc0 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
36dd0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
36de0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
36df0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36e00 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
36e10 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
36e20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
36e30 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
36e40 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
36e50 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36e60 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
36e70 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
36e80 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
36e90 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
36ea0 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
36eb0 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
36ec0 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
36ed0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
36ee0 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
36ef0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
36f00 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36f10 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
36f20 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
36f30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
36f40 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
36f50 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
36f60 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
36f70 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36f90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36fa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36fb0 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
36fc0 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
36fd0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
36fe0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
36ff0 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
37000 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
37010 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
37020 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
37030 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
37040 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
37050 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
37060 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
37070 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
37080 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
37090 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
370a0 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
370b0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
370c0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
370d0 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
370e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
370f0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
37100 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
37110 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
37120 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
37130 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
37140 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
37150 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
37160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
37170 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
37180 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
37190 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
371a0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
371b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
371c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
371d0 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
371e0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
371f0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
37200 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
37210 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
37220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
37230 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
37240 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37250 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
37260 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
37270 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
37280 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
37290 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
372a0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
372b0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
372c0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
372d0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
372e0 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
372f0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
37300 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
37310 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
37320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37330 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
37340 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto the en
37350 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  d of the rollbac
37360 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  k journal..*/.st
37370 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
37380 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64  LINE int pagerAd
37390 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
373a0 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
373b0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
373c0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
373d0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  r;.  int rc;.  u
373e0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72  32 cksum;.  char
373f0 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20   *pData2;.  i64 
37400 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
37410 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
37420 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
37430 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
37440 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
37450 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f  age that.  ** co
37460 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
37470 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
37480 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
37490 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74   verifies.  ** t
374a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
374b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
374c0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
374d0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
374e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
374f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
37500 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37510 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50  f );.  CODEC2(pP
37520 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
37530 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
37540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37550 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32  MEM_BKPT, pData2
37560 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67  );.  cksum = pag
37570 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
37580 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
37590 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
375a0 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
375b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
375c0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
375d0 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  e.  ** page in t
375e0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
375f0 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
37600 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
37610 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  age..  ** Otherw
37620 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
37630 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
37640 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
37650 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79  gic in.  ** play
37660 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
37670 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
37680 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
37690 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
376a0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
376b0 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
376c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
376d0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
376e0 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72  o,.  ** then cor
376f0 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
37700 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ow..  */.  pPg->
37710 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37720 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20  EED_SYNC;..  rc 
37730 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37740 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
37750 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69   pPg->pgno);.  i
37760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37770 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
37790 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
377a0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
377b0 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
377c0 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
377d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
377e0 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74   rc;.  rc = writ
377f0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
37800 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
37810 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
37820 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
37830 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37840 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43  rn rc;..  IOTRAC
37850 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
37860 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
37870 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
37880 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
37890 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
378a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
378b0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
378c0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
378d0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  tej_count);.  PA
378e0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
378f0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
37900 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
37910 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
37920 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37930 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
37940 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
37950 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
37960 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
37970 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
37980 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37990 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
379a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
379b0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
379c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
379d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
379e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
379f0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
37a00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37a10 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
37a20 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37a30 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73  E_NOMEM );.  ass
37a40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
37a50 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
37a60 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c  _NOMEM );.  rc |
37a70 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
37a80 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
37a90 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73  pPg->pgno);.  as
37aa0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
37ab0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
37ac0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
37ad0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37ae0 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
37af0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
37b00 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
37b10 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
37b20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
37b30 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
37b40 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
37b50 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
37b60 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
37b70 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
37b80 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
37b90 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
37ba0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
37bb0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
37bc0 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
37bd0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
37be0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
37bf0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
37c00 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
37c10 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
37c20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
37c30 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
37c40 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
37c50 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37c70 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
37c80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
37c90 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
37ca0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37cb0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
37cc0 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
37cd0 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
37ce0 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
37cf0 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
37d00 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
37d10 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
37d20 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
37d30 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
37d40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37d50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37d60 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37d70 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37d80 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37d90 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
37da0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37db0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37dc0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
37dd0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37de0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37e00 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20  ger->errCode==0 
37e10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37e20 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ger->readOnly==0
37e30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45   );.  CHECK_PAGE
37e40 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
37e50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
37e60 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
37e70 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
37e80 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
37e90 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
37ea0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
37eb0 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
37ec0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
37ed0 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
37ee0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
37ef0 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
37f00 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
37f10 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
37f20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
37f30 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
37f40 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
37f50 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37f60 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
37f70 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
37f80 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
37f90 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
37fa0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
37fb0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
37fc0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
37fd0 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
37fe0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
37ff0 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
38000 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
38010 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
38020 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
38030 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
38040 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
38050 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
38060 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
38070 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
38080 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
38090 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
380a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
380b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
380c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
380d0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
380e0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
380f0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
38100 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
38110 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
38120 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 74 68  Mark the page th
38130 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  at is about to b
38140 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69  e modified as di
38150 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rty. */.  sqlite
38160 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
38170 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
38180 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
38190 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68  al is in use, th
381a0 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  em make sure the
381b0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62   page that is ab
381c0 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  out.  ** to chan
381d0 67 65 20 69 73 20 69 6e 20 74 68 65 20 72 6f 6c  ge is in the rol
381e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f  lback journal, o
381f0 72 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  r if the page is
38200 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66 66 0a   a new page off.
38210 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66    ** then end of
38220 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20   the file, make 
38230 73 75 72 65 20 69 74 20 69 73 20 6d 61 72 6b 65  sure it is marke
38240 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f  d as PGHDR_NEED_
38250 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  SYNC..  */.  ass
38260 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 70 49  ert( (pPager->pI
38270 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20  nJournal!=0) == 
38280 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
38290 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
382a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
382b0 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  =0.   && sqlite3
382c0 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
382d0 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  l(pPager->pInJou
382e0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
382f0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  ==0.  ){.    ass
38300 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
38310 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
38320 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
38330 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
38340 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
38350 20 3d 20 70 61 67 65 72 41 64 64 50 61 67 65 54   = pagerAddPageT
38360 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c  oRollbackJournal
38370 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
38380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
38390 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
383a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
383b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
383c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
383d0 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
383e0 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
383f0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
38400 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
38410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47       }.      PAG
38420 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
38430 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
38440 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
38450 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
38460 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
38470 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
38480 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
38490 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
384a0 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20  ?1:0)));.    }. 
384b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 47 48   }..  /* The PGH
384c0 44 52 5f 44 49 52 54 59 20 62 69 74 20 69 73 20  DR_DIRTY bit is 
384d0 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e 20 74  set above when t
384e0 68 65 20 70 61 67 65 20 77 61 73 20 61 64 64 65  he page was adde
384f0 64 20 74 6f 20 74 68 65 20 64 69 72 74 79 2d 6c  d to the dirty-l
38500 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66  ist.  ** and bef
38510 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20  ore writing the 
38520 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 72 6f  page into the ro
38530 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
38540 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c   Wait until now,
38550 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20  .  ** after the 
38560 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 73 75  page has been su
38570 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e  ccessfully journ
38580 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20 73 65  alled, before se
38590 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50  tting the.  ** P
385a0 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 20 62  GHDR_WRITEABLE b
385b0 69 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  it that indicate
385c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
385d0 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 6d 6f  can be safely mo
385e0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  dified..  */.  p
385f0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
38600 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a 20 20  DR_WRITEABLE;.  
38610 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
38620 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
38630 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
38640 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
38650 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
38660 65 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  e the page into 
38670 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
38680 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
38690 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
386a0 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20 20 72 63  oint>0 ){.    rc
386b0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
386c0 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29  eIfRequired(pPg)
386d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
386e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
386f0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
38700 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
38710 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
38720 6e 6f